首页 > 代码库 > 【Android进阶】解析XML文件之使用DOM解析器

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用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());
		}

	}

下面是解析结果



有疑问可以留言