Jack_King007的专栏

02dom解析

DOM是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分,通过DOM将XML文档作为一个树状的结构,这种树状的结构成为节点树




第一步 新建类DOM解析类

package com.xiaoxin.xml.DOM;

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.xiaoxin.xml.bean.Person;

public class Dom {
	public static List<Person> getPersons(InputStream inStream)
			throws Exception {
		// 1.用一个集合来放东西
		List<Person> persons = new ArrayList<Person>();
		// 2.DocumentBuilderFactory该对象将创建DocumentBuilder
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();


		// 设置去掉空格的方法

		factory.setIgnoringElementContentWhitespace(true);

		// 3.DocumentBuilder 将实际进行解析以创建Document
	
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 4.将文件路径进行解析
		Document document = builder.parse(inStream);
		// 5.返回文档的根元素
		Element root = document.getDocumentElement();
		// 6.取出某个特定的元素。一开始以为它的返回值是一个数组,结果,大错特错。它返回的是一个 DOM 对象,可以遍历,有 length
		// 属性,但不是数组。

		NodeList personNodes = root.getElementsByTagName("person");
		//开始遍历整个XML
		for (int i = 0; i < personNodes.getLength(); i++) {
			Element perElement = (Element) personNodes.item(i);
			//对给定的Node返回给定名称的属性,并且是interger类型的
			int id = new Integer(perElement.getAttribute("id"));
			Person person = new Person();
			//设置ID的属性
			person.setId(id);
			NodeList childNodes = perElement.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;

	}
}

第二部  测试代码 与SAX测试代码是相差不大的

package com.xiaoxin.xml.DOM;

import java.io.InputStream;
import java.util.List;

import com.xiaoxin.xml.bean.Person;

import android.test.AndroidTestCase;
import android.util.Log;

public class DomPersonService extends AndroidTestCase {
	private static final String TAG = "DomPersonService";

	public void testDom() throws Throwable {
		// 因为XML在src文件中 可以直接反射到路径 inputStream
		InputStream inputStream = this.getClass().getClassLoader()
				.getResourceAsStream("xiaoxin.xml");
		List<Person>persons=Dom.getPersons(inputStream);
		for(Person person:persons){
			Log.i(TAG, person.toString());
		}
	}
}