android之dom解析xml

举报
ShaderJoy 发表于 2021/12/30 02:26:51 2021/12/30
【摘要】 好吧,我们还是来实现这张图的效果,只不过技术我们改为了dom,至于这里的图片上为什么显示的是sax解析,我只能说,哎,没办法,我想偷懒啊。嘿嘿……再看代码结构图: main.xml <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns...

好吧,我们还是来实现这张图的效果,只不过技术我们改为了dom,至于这里的图片上为什么显示的是sax解析,我只能说,哎,没办法,我想偷懒啊。嘿嘿……再看代码结构图:

main.xml


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:id="@+id/textView"
  11. />
  12. </LinearLayout>
解析用的XML文件:
beauties.xml

  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beauties>
  3. <beauty>
  4. <name>林志玲</name>
  5. <age>28</age>
  6. </beauty>
  7. <beauty>
  8. <name>杨幂</name>
  9. <age>23</age>
  10. </beauty>
  11. </beauties>
activity的代码:

  
  1. package cn.com.dom;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import org.w3c.dom.Document;
  7. import org.w3c.dom.Element;
  8. import org.w3c.dom.Node;
  9. import org.w3c.dom.NodeList;
  10. import android.app.Activity;
  11. import android.os.Bundle;
  12. import android.util.Log;
  13. import android.widget.TextView;
  14. /**
  15. *
  16. * @author chenzheng_java
  17. * @description 使用dom解析xml
  18. * @since 2011/03/04
  19. *
  20. */
  21. public class DomParseXmlTest extends Activity {
  22. // 存储最终在前台显示的内容
  23. private String result = "";
  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.main);
  28. InputStream inputStream = this.getClassLoader().getResourceAsStream(
  29. "beauties.xml");
  30. try {
  31. DocumentBuilderFactory factory = DocumentBuilderFactory
  32. .newInstance();
  33. DocumentBuilder builder = factory.newDocumentBuilder();
  34. Document document = builder.parse(inputStream);
  35. // 获取根节点
  36. Element root = document.getDocumentElement();
  37. parse(root);
  38. for (Beauty b : beautyList) {
  39. result += b.toString();
  40. }
  41. TextView textView = (TextView) findViewById(R.id.textView);
  42. textView.setText(result);
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. private Beauty beauty = null;
  48. private ArrayList<Beauty> beautyList = new ArrayList<Beauty>();
  49. /**
  50. *
  51. * @param element 将要进行遍历的节点
  52. */
  53. private void parse(Element element) {
  54. NodeList nodelist = element.getChildNodes();
  55. int size = nodelist.getLength();
  56. for (int i = 0; i < size; i++) {
  57. // 获取特定位置的node
  58. Node element2 = (Node) nodelist.item(i);
  59. /* getNodeName获取tagName,例如<book>thinking in android</book>这个Element的getNodeName返回book
  60. * getNodeType返回当前节点的确切类型,如Element、Attr、Text等
  61. * getNodeValue 返回节点内容,如果当前为Text节点,则返回文本内容;否则会返回null
  62. * getTextContent 返回当前节点以及其子代节点的文本字符串,这些字符串会拼成一个字符串给用户返回。例如
  63. * 对<book><name>thinking in android</name><price>12.23</price></book>调用此方法,则会返回“thinking in android12.23”
  64. */
  65. String tagName = element2.getNodeName();
  66. if (tagName.equals("beauty")
  67. && element2.getNodeType() == Document.ELEMENT_NODE) {
  68. beauty = new Beauty();
  69. Log.i("通知:", "创建beauty");
  70. if (element2.getNodeType() == Document.ELEMENT_NODE) {
  71. parse((Element) element2);//这里用了递归,最好改成迭代来实现
  72. }
  73. Log.i("通知:", "添加beauty");
  74. beautyList.add(beauty);
  75. }
  76. if (tagName.equals("name")) {
  77. String name = element2.getTextContent();
  78. Log.i("通知:", "name" + name);
  79. beauty.setName(name);
  80. }
  81. if (tagName.equals("age")) {
  82. String age = element2.getTextContent();
  83. Log.i("通知:", "age" + age);
  84. beauty.setAge(age);
  85. }
  86. }
  87. }
  88. /**
  89. *
  90. * @author chenzheng_java 这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间
  91. *
  92. */
  93. private class Beauty {
  94. String name;
  95. String age;
  96. public String getName() {
  97. return name;
  98. }
  99. public void setName(String name) {
  100. this.name = name;
  101. }
  102. public String getAge() {
  103. return age;
  104. }
  105. public void setAge(String age) {
  106. this.age = age;
  107. }
  108. @Override
  109. public String toString() {
  110. return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";
  111. }
  112. }
  113. }

其他都为默认。执行,然后就可以看到正确的结果了

----------------------------------------------------------------------------------

总结:

写博客的时候,不总结几句废话的孩子不是好孩子。所以,我决定还是说几句:

DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。

dom的原理:

dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。

 这里列出几个dom中经常用到的方法

Node 接口的常用方法

short getNodeType()方法:

返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:Node.ELEMENT_NODE

NodeList  getChildNodes()

返回一个由当前节点的所有子节点组成的NodeList对象。

Node  getFirstChild()

返回当前节点的第一个子节点。

Node  getLastChild()

返回当前节点的最后一个子节点。

NodeList  getTextContent()

返回当前节点及所有子孙节点中的文本内容。

还有其他的很多很多方法,我们可以通过api来详细了解。因为这里主要是为了学习android,所以关于dom稍微了解下就可以了。



文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8831648

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。