除了使用 SAX可以解析XML文件,大家也可以使用熟悉的DOM来解析XML文件。 DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许您使用DOMAPI遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来是比较直观的,并且在编码方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容以文档树方式存放在内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM也是可行的。
下面是实现代码
package com.scl.parse; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.scl.domain.Person; public class DOMParsePerson { public List<Person> getPersons(InputStream in) throws Throwable{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); //装载成document树对象 Document document = builder.parse(in); //获得根节点 Element root = document.getDocumentElement(); //获得根节点的子节点 NodeList persons = root.getElementsByTagName("person"); //遍历所有person节点 List<Person> personsList = new ArrayList<Person>(); for(int i = 0;i < persons.getLength(); i ++){ Person person = new Person(); //获得一个person节点 Element personElement = (Element)persons.item(i); //获得一个person节点的id属性,并把id的值设置给person person.setId(new Integer(personElement.getAttribute("id"))); NodeList childNodes = personElement.getChildNodes(); //循环person节点的子节点 for(int j = 0;j < childNodes.getLength();j++){ Node child = childNodes.item(j); if(child.getNodeType() == Node.ELEMENT_NODE){ Element e = (Element)child; if("name".equals(child.getNodeName())){ person.setName(child.getFirstChild().getNodeValue()); } else if("age".equals(child.getNodeName())){ person.setAge(new Short(child.getFirstChild().getNodeValue())); } } } personsList.add(person); } return personsList; } }
下面是单元测试代码
public void testDOMParserTest() throws Throwable{ InputStream in = this.getClass().getClassLoader().getResourceAsStream("person.xml"); DOMParsePerson dom = new DOMParsePerson(); List<Person> persons = dom.getPersons(in); for(Person p : persons){ Log.i(TAG, p.toString()); } }