Android之DOM解析XML

来源:互联网 发布:urllib json 编辑:程序博客网 时间:2024/06/04 18:42

原文地址

昨天晚上发了一篇用SAX解析XML文件的博客,有兴趣的可以去看下,今天我用的DOM解析,DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低。

XML基本的节点类型

node - DOM基本的数据类型

Element - 最主要处理的对象是Element

Attr - 元素的属性

Text - 一个Element 或者Attr的实际内容

Document - 代表整个XML文档,一个Document对象通常也称为一颗DOM树

 

1.在src目录下新建一个android.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>xiaanming</name>  
  5.         <age>23</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>liudehua</name>  
  9.         <age>28</age>  
  10.     </person>  
  11. </persons>  


2.新建一个Person对象来存放解析的内容

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.dom_parser;  
  2.   
  3. public class Person {  
  4.     private int id;  
  5.     private String name;  
  6.     private int age;  
  7.       
  8.     public Person(){}  
  9.       
  10.     public Person(int id, String name, int age){  
  11.         this.id = id;  
  12.         this.name = name;  
  13.         this.age = age;  
  14.     }  
  15.   
  16.     public int getId() {  
  17.         return id;  
  18.     }  
  19.   
  20.     public void setId(int id) {  
  21.         this.id = id;  
  22.     }  
  23.   
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.   
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.   
  32.     public int getAge() {  
  33.         return age;  
  34.     }  
  35.   
  36.     public void setAge(int age) {  
  37.         this.age = age;  
  38.     }  
  39.       
  40.     @Override  
  41.     public String toString() {  
  42.         return "id = " + id + ", name = " + name + ", age = " + age;  
  43.     }  
  44.       
  45. }  

3 新建一个DomPersonService.class,注释我写的清楚,大家自己看

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.dom_parser;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.xml.parsers.DocumentBuilder;  
  8. import javax.xml.parsers.DocumentBuilderFactory;  
  9.   
  10. import org.w3c.dom.Document;  
  11. import org.w3c.dom.Element;  
  12. import org.w3c.dom.Node;  
  13. import org.w3c.dom.NodeList;  
  14.   
  15. import android.util.Log;  
  16.   
  17.   
  18. public class DomPersonService {  
  19.       
  20.       
  21.     public static List<Person> readXML() throws Throwable{  
  22.         //获得android.xml文件的输入流  
  23.         InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("android.xml");  
  24.         List<Person> persons = new ArrayList<Person>();  
  25.           
  26.         //实例化DocumentBuilderFactory和DocumentBuilder,并创建Document  
  27.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  28.         DocumentBuilder builder = factory.newDocumentBuilder();  
  29.         Document document = builder.parse(is);  
  30.           
  31.         //返回文档的根(root)元素  
  32.         Element rootElement =  document.getDocumentElement();  
  33.           
  34.         //获取一个Note(DOM基本的数据类型)集合,这里有两个person Note  
  35.         NodeList nodes = rootElement.getElementsByTagName("person");  
  36.           
  37.         //遍历Note集合  
  38.         for(int i=0; i<nodes.getLength(); i++){  
  39.             //先从第一个person元素开始解析  
  40.             Element personElement = (Element) nodes.item(i);  
  41.             Person person = new Person();  
  42.             person.setId(Integer.valueOf(personElement.getAttribute("id")));  
  43.               
  44.             //获取person下面的name 和 age 的Note集合  
  45.             NodeList chileNodes = personElement.getChildNodes();  
  46.             for(int y=0; y<chileNodes.getLength(); y++){  
  47.                 Node childNode = chileNodes.item(y);  
  48.                   
  49.                 //判断子Note的类型为元素Note  
  50.                 if(childNode.getNodeType() == Node.ELEMENT_NODE){  
  51.                     Element childElement = (Element) childNode;  
  52.                 if("name".equals(childElement.getNodeName())){  
  53.                     person.setName(childElement.getFirstChild().getNodeValue());  
  54.                 }else if("age".equals(childElement.getNodeName())){  
  55.                     person.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));  
  56.                 }  
  57.                 }  
  58.             }  
  59.               
  60.             Log.e("log", person.toString());  
  61.               
  62.             persons.add(person);  
  63.         }  
  64.           
  65.         return persons;  
  66.           
  67.     }  
  68. }  

关于DOM解析XML,我们要清楚的知道个节点之间的关系,才能更好的操作对象树,值得注意的是在建立Element时,要注意jar包的导入, 要选择org.w3c.dom.Element,而不是其他的包,


0 0
原创粉丝点击