解析XML文件之使用DOM解析器
2015-12-12 23:22
429 查看
在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小。这篇文章主要介绍使用DOM解析器对XML文件进行解析。DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好。但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式。
下面介绍使用DOM解析器对XML进行解析。
下面是我们需要解析的xml文件
我们的person实体类
我们的解析代码,因为注释比较多,所以不过多解释。
下面是我们的单元测试方法,对解析器进行单元测试
下面是解析结果
在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小。这篇文章主要介绍使用DOM解析器对XML文件进行解析。DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好。但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式。
下面介绍使用DOM解析器对XML进行解析。
下面是我们需要解析的xml文件
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>liming</name> <age>30</age> </person> <person id="20"> <name>lixiangmei</name> <age>25</age> </person> </persons>
我们的person实体类
public class Person { private Integer id; private String name; private Short age; public Person(){} public Person(Integer id, String name, Short age) { this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Short getAge() { return age; } public void setAge(Short age) { this.age = age; } @Override public String toString() { return "Person [age=" + age + ", id=" + id + ", name=" + name + "]"; } }
我们的解析代码,因为注释比较多,所以不过多解释。
/** * 采用DOM对XML进行解析 * * @author ZhaoKaiQiang * * @time 2014年6月3日 */ public class DOMResovel { public static List<Person> getPersons(InputStream inputStream) throws Exception { List<Person> persons = new ArrayList<Person>(); // 获取DOM解析器 DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); // 获取解析好的文档树 Document document = documentBuilder.parse(inputStream); // 获取根元素节点 Element root = document.getDocumentElement(); // 获取根元素下面的所以person节点 NodeList personList = root.getElementsByTagName("person"); //遍历所有的person节点 for (int i = 0; i < personList.getLength(); i++) { Person person = new Person(); // 获取每一个person节点 Element personElement = (Element) personList.item(i); //设置person对象属性 person.setId(new Integer(personElement.getAttribute("id"))); // 获取person下面的子节点 NodeList childList = personElement.getChildNodes(); // 遍历子节点 for (int j = 0; j < childList.getLength(); j++) { //判断是否是元素节点 if (childList.item(j).getNodeType() == Node.ELEMENT_NODE) { Element chilElement = (Element) childList.item(j); if ("name".equals(chilElement.getNodeName())) { person.setName(chilElement.getFirstChild().getNodeValue()); } else if ("age".equals(chilElement.getNodeName())) { person.setAge(new Short(chilElement.getFirstChild().getNodeValue())); } } } persons.add(person); } return persons; } }
下面是我们的单元测试方法,对解析器进行单元测试
public void testDom() throws Exception { InputStream inStream = getClass().getClassLoader().getResourceAsStream("persons.xml"); List<Person> persons = DOMResovel.getPersons(inStream); for (Person person : persons) { Log.i(TAG, person.toString()); } }
下面是解析结果
相关文章推荐
- 关于ListView中item与控件抢夺焦点的那些事
- LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal解题报告
- java十分钟速懂知识点——System类
- 如何使用文件来保存程序中的数据
- 解析XML文件之使用SAM解析器
- 贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组
- c语言:用户输入10个整数,程序找出其中的最大值和最小值
- LeetCode 263:Ugly Number
- Junit单元测试环境搭建以及简单实用
- git的下载与安装步骤(win10系统)
- Redis时延问题
- 第三个Sprint冲刺第6天
- ISE中的PLL时钟输入
- hdu 5596
- 【LWJGL官方教程】输入处理
- 关于分布式一致性的探究
- Xcode6添加pch文件
- [CUDA]初学CUDA遇到的比较烧脑的问题
- 关于PagerAdapter的使用方法的总结
- Android面试题目整理与讲解(一)