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