在前面的文章中,介绍了使用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());
- }
-
- }
下面是解析结果
有疑问可以留言