androidのDOM方式解析XML

androidのDOM方式解析XML

在Android中,常见的XML解析器分别为DOM解析器、SAX解析器和PULL解析器

第一种方式:DOM解析器:

      DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。

DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档——这就是DOM的工作原理。

DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。 

由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的。

 

常用的DoM接口和类:

  Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。  

Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。

Node:该接口提供处理并获取节点和子节点值的方法。

NodeList:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。

DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。

接下来看代码实现:
package com.wyl.example;


import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	private TextView mTvShow; 
	private Button mBtnDom; 

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findView();
		setListener();
	}

	private void setListener() {
		mBtnDom.setOnClickListener(myListener);
	}

	private void findView() {
		mTvShow = (TextView) findViewById(R.id.textview);
		mBtnDom = (Button) findViewById(R.id.btnDom);
	}

	private OnClickListener myListener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			// 1. 获取当前工程下的people.xml文件流
			InputStream inputStream = MainActivity.class.getClassLoader()
					.getResourceAsStream("people.xml");
			//定义Person对象
			List<Person> persons = null;
			mTvShow.setText("");
			switch (v.getId()) {
			case R.id.btnDom:    //DOM
				mTvShow.setText("DOM:");
				try {
					//使用DOMPersonService解析xml
					persons = DOMPersonService.readXml(inputStream);
				} catch (ParserConfigurationException e) {
					e.printStackTrace();
				} catch (SAXException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				break;
			default:
				break;
			}
			//显示结果
			for (Person person : persons) {
				mTvShow.setText(mTvShow.getText().toString() + "\n" + person.toString());
			}
		}
	};
}

还要定义一个Person类
package com.wyl.example;

public class Person {
	private Integer id;
	private String name;
	private Short age;

	public Person() {
		super();
	}

	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 "id = " + id + "name = " + name + "age = " + age;
	}
}

主要解析类
package com.wyl.example;


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

//dom解析xml类
public class DOMPersonService {
	public static List<Person> readXml(InputStream inStream)
			throws ParserConfigurationException, SAXException, IOException {
		List<Person> persons = new ArrayList<Person>();
		// 实力化一个文档构建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 通过文档构建工厂构建文档构建器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 通过文档构建工厂构建文档实例
		Document document = builder.parse(inStream);
		// 得到文档根结点
		Element root = document.getDocumentElement();
		// 得到所有的person节点
		NodeList nodes = root.getElementsByTagName("person");
		// 循环判断每个节点的内容
		for (int i = 0; i < nodes.getLength(); i++) {
			// 得到节点对象
			Element personElement = (Element) nodes.item(i);
			// 定义person对象
			Person person = new Person();
			// 得到xml属性
			person.setId(Integer.valueOf(personElement.getAttribute("id")));
			// 得到xml子结点
			NodeList childNodes = personElement.getChildNodes();
			for (int j = 0; j < childNodes.getLength(); j++) {
				// 得到每个结点对象
				Node childNode = (Node) childNodes.item(j);
				// 如果当前节点为内容节点,取相应的内容
				if (childNode.getNodeType() == Node.ELEMENT_NODE) {
					Element childElement = (Element) childNode;
					if ("name".equals(childElement.getNodeName())) {
						person.setName(childElement.getFirstChild()
								.getNodeValue());
					} else if ("age".equals(childElement.getNodeName())) {
						person.setAge(new Short(childElement.getFirstChild()
								.getNodeValue()));
					}
				}
			}
			// 添加链表中
			persons.add(person);
		}
		return persons;
	}
}

最后看下解析的xml
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:pre="http://www.baidu.com">
    <person id="001">
        <name>coolszy</name>
        <age>22</age>
    </person>
    <person id="002">
        <name>kuka</name>
        <age>23</age>
    </person> 
    <person id="003">
        <name>wyl</name>
        <age>30</age>
    </person> 
</persons>


注意:xml 文件放在src 目录下,不能放在package目录下这种使用
InputStream inputStream = MainActivity.class.getClassLoader().getResourceAsStream("people.xml");

Dom方式解析特点是一次性加载所有文件到内存中,然后根据DOM树方式进行解析,优点是解析速度快,缺点是比较耗费内存,不能中途停止。



你可能感兴趣的:(android,xml,dom)