解析XML文件之使用DOM解析器

来源:互联网 发布:cf淘宝刷枪是真的吗 编辑:程序博客网 时间:2024/04/28 12:15
http://blog.csdn.net/zhaokaiqiang1992/article/details/28256051

 

解析XML文件之使用DOM解析器

标签: domxml单元测试解析文档
 1151人阅读 评论(0) 收藏 举报
 分类:

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小。这篇文章主要介绍使用DOM解析器对XML文件进行解析。DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好。但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式。

下面介绍使用DOM解析器对XML进行解析。

下面是我们需要解析的xml文件

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

我们的person实体类


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

我们的解析代码,因为注释比较多,所以不过多解释。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /**  
  2.  * 采用DOM对XML进行解析  
  3.  *   
  4.  * @author ZhaoKaiQiang  
  5.  *   
  6.  * @time 2014年6月3日  
  7.  */  
  8. public class DOMResovel {  
  9.   
  10.     public static List<Person> getPersons(InputStream inputStream) throws Exception {  
  11.   
  12.         List<Person> persons = new ArrayList<Person>();  
  13.         // 获取DOM解析器  
  14.         DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
  15.         // 获取解析好的文档树  
  16.         Document document = documentBuilder.parse(inputStream);  
  17.         // 获取根元素节点  
  18.         Element root = document.getDocumentElement();  
  19.         // 获取根元素下面的所以person节点  
  20.         NodeList personList = root.getElementsByTagName("person");  
  21.         //遍历所有的person节点  
  22.         for (int i = 0; i < personList.getLength(); i++) {  
  23.             Person person = new Person();  
  24.             // 获取每一个person节点  
  25.             Element personElement = (Element) personList.item(i);  
  26.             //设置person对象属性  
  27.             person.setId(new Integer(personElement.getAttribute("id")));  
  28.             // 获取person下面的子节点  
  29.             NodeList childList = personElement.getChildNodes();  
  30.             // 遍历子节点  
  31.             for (int j = 0; j < childList.getLength(); j++) {  
  32.                 //判断是否是元素节点  
  33.                 if (childList.item(j).getNodeType() == Node.ELEMENT_NODE) {  
  34.                     Element chilElement = (Element) childList.item(j);  
  35.                     if ("name".equals(chilElement.getNodeName())) {  
  36.                         person.setName(chilElement.getFirstChild().getNodeValue());  
  37.                     } else if ("age".equals(chilElement.getNodeName())) {  
  38.                         person.setAge(new Short(chilElement.getFirstChild().getNodeValue()));  
  39.                     }  
  40.                 }  
  41.             }  
  42.             persons.add(person);  
  43.         }  
  44.   
  45.         return persons;  
  46.     }  
  47.   
  48. }  

下面是我们的单元测试方法,对解析器进行单元测试

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void testDom() throws Exception {  
  2.         InputStream inStream = getClass().getClassLoader().getResourceAsStream("persons.xml");  
  3.         List<Person> persons = DOMResovel.getPersons(inStream);  
  4.   
  5.         for (Person person : persons) {  
  6.             Log.i(TAG, person.toString());  
  7.         }  
  8.   
  9.     }  

下面是解析结果



有疑问可以留言


0 0