首页 > 代码库 > Android中的DOM解析方式

Android中的DOM解析方式

1、DOM解析简介

        DOM解析会将XML文件的内容,以对象树的形式存放在内存中。DOM解析采用了对象树这种形式存储,使它易于遍历,方便的知道上下层节点的情况,这是DOM解析与SAX解析最大的不同之处。SAX解析只能够知道自己节点的情况,无法得知其它节点的信息。


2、DOM解析常用方法

(1)Document.getDocumentElement():返回文档的根元素
(2)Node.getPreviousSibling()、Node.getNextSibling():返回上一个或者下一个同胞元素
(3)Node.getFirstChild()、Node.getLastChild():返回给定节点的第一个子节点或者最后一个节点
(4)Node.getAttribute(attrName):获取指定属性的对象


3、DOM解析思路

(1)不用说,第一步还是创建一个存储XML文件读取信息的实体对象
(2)创建一个DocumentBuilderFactory对象,根据它得到DocumentBuilder对象
(3)DocumentBuilder实例调用parse方法,传递的参数是读取的文件流对象

(4)根据节点名称、属性值等信息遍历XML文件,存储起来


4、举例说明

4.1 新建实体:

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;
	}
	// 省略setter()和getter()方法
}


4.2 解析类:

	public static List<Person> getPersons(InputStream inStream) throws Exception{
		List<Person> persons = new ArrayList<Person>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse(inStream);
		Element root = document.getDocumentElement();
		NodeList personNodes = root.getElementsByTagName("person");
		for(int i=0; i < personNodes.getLength() ; i++){
			Element personElement = (Element)personNodes.item(i);
			int id = new Integer(personElement.getAttribute("id"));
			Person person = new Person();
			person.setId(id);
			NodeList childNodes = personElement.getChildNodes();
			for(int y=0; y < childNodes.getLength() ; y++){
				if(childNodes.item(y).getNodeType()==Node.ELEMENT_NODE){
					if("name".equals(childNodes.item(y).getNodeName())){
						String name = childNodes.item(y).getFirstChild().getNodeValue();
						person.setName(name);
					}else if("age".equals(childNodes.item(y).getNodeName())){
						String age = childNodes.item(y).getFirstChild().getNodeValue();
						person.setAge(new Short(age));
					}
				}
			}
			persons.add(person);
		}
		inStream.close();
		return persons;
	}

5、对比SAX解析

(1)SAX的事件驱动是回调相应的方法,需要提供回调的方法。

(2)DOM解析中是一种树形的结构,节点与节点之间都有这等级关系,我们简单的给出一个图示如下:

我们对比看看的xml文件的内容与解析出来的树形结构图:


Android中的DOM解析方式