除了可以使用 SAX解析XML文件,大家也可以使用熟悉的DOM来解析XML文件。 DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。
关键代码一
package com.leequer.Service;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import com.leequer.Doem.Person;
import android.test.AndroidTestCase;
import android.util.Log;
public class Test extends AndroidTestCase {
private String PERSONSTRING = "ObjectPerson";
public void testReadXml() throws Exception
{//类装载器
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("NewFile.xml");
List <Person> personsList = ReadXmlByDomService.ReadXmlByDom(inputStream);
for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {
Person person = (Person) iterator.next();
Log.i(PERSONSTRING, person.toString());
}
}
}
关键代码二
package com.leequer.Service;
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.leequer.Doem.Person;
/**
* 使用dom解析xml
* 2010-04-26
* @author leequer
*
*/
public class ReadXmlByDomService {
public static List<Person> ReadXmlByDom (InputStream inputStream)throws Exception
{
List <Person> personList = new ArrayList<Person>();
//创建文档读取工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//创建读去对象
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//对以输入流方式传进来的信息进行解析 整个xml文档就以树的形式存在document中
Document document = builder.parse(inputStream);
//得到根元素
Element root = document.getDocumentElement();
//得到person元素节点 这个对象中就存在persons下面的所以节点 就是很多的person节点
NodeList nodes = root.getElementsByTagName("person");
for(int i= 0 ;i<nodes.getLength();i++)
{
/**
* persons下面的节点是元素节点 person 用element就行了
*/
Element element = (Element)nodes.item(i);
Person person = new Person();
person.setId(element.getAttribute("id"));//属性
/**
* perons节点中包含的有元素节点name age 和文本节点 23 李明 所以我们迭代的时候要用note
*/
NodeList childnotes = element.getChildNodes();//得到子节点的列表
for (int j = 0 ; j < childnotes.getLength();j++)
{
Node node = (Node)childnotes.item(j);
/**
* node中有元素 也有文本节点 还包括回车和空格的文本节点 但是我们不关心回车和空格
*/
if(node.getNodeType()==Node.ELEMENT_NODE)
{
//如果是element节点 把它转换成element
Element childElement = (Element)node;
if("name".equals(childElement.getNodeName()))
{
person.setName(childElement.getFirstChild().getNodeValue());
}
if("age".equals(childElement.getNodeName()))
{
person.setAge(childElement.getFirstChild().getNodeValue());
}
}
}
personList.add(person);
}
return personList;
}
}