Android -使用DOM(文档对象模型)解析XML文件
1. 介绍
DOM(Document Object Model)是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。在DOM中,文档被模拟为树状,其中XML语法的每个组成部分(例如元素或文本内容)都被表示为一个节点。作为一种API,DOM允许用户遍历文档树,从父节点移动到子节点和兄弟节点等,并利用某种节点类型特有的属性(元素具有属性,而文本具有文本数据)。DOM被设计为与语言无关。OMG(object Management Group,对象管理组)的CORBA interface Definition Language 可用于表示DOM节点和支持接口。通常,DOM比SAX更容易掌握,因为它没有设计回调和复杂的状态管理。然而,DOM的实现常常将所有XML节点保存在内存中,这使处理较大的文档变得效率低下。
下面解析一段xml文件:version.xml
 
<update>
	<version>2</version>
	<name>baidunews_v100.apk</name>
	<url>http://softdl1.tech.qq.com/soft/92/baidunews_v100.apk</url>
</update>

 
 

Android -使用DOM(文档对象模型)解析XML文件_Object

2. 节点 (xml文档中的每个成分都是一个节点)
DOM是这样规定的:
(1)整个文档时一个文档节点
(2)每个XML标签是一个元素节点
(3)包含在XML元素中的文本时文本节点。
(4)每一个XML属性是一个属性节点
(5)注释属于注释节点
在上图中,根节点是<update>.文档的其他节点都被包含在<update>中。
 
3. DOM基本的节点类型
·Node-DOM基本的数据类型
·Element-最主要处理的对象是Element
·Attr-代表一个元素的属性
·Text-一个Element或Attr的实际内容。
·Document-代表整个XML文档,一个Document对象通常也被称为一棵DOM树
 
4. 常犯错误:文本存储在哪里?
元素节点的文本时放在TextNode中的。可以说<version>有一个TextNodee,它的值是2,而不可以说<version>元素的值是2
 
5.等级关系
·在节点树中,顶端的节点成为根节点。
·根节点之外的每个节点都有一个父节点。
·节点可以有任何数量的子节点;
·叶子是没有子节点的节点。
·同级及节点是拥有父节点的节点。
 
6. DOM常用方法
·Document.getDocumentElement():返回文档的根(root)元素。
·Node.getNextSibling() and Node.getPreviousSibling():这些方法返回下一个或前一个给定Node的同胞。
·Node.getFirstChild() and Node.getLastChild():返回给定Node的第一个子女。
·Node.getAttribute(attrName):对给定的Node返回给定名称的属性。
 
实例:
public class ParseXmlService
{
	public HashMap<String, String> parseXml(InputStream inStream) throws Exception
	{
		HashMap<String, String> hashMap = new HashMap<String, String>();
		
		// 实例化一个文档构建器工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 通过文档构建器工厂获取一个文档构建器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 通过文档通过文档构建器构建一个文档实例
		Document document = builder.parse(inStream);
		//获取XML文件根节点
		Element root = document.getDocumentElement();
		//获得所有子节点
		NodeList childNodes = root.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 ("version".equals(childElement.getNodeName()))
				{
					hashMap.put("version",childElement.getFirstChild().getNodeValue());
				}
				//软件名称
				else if (("name".equals(childElement.getNodeName())))
				{
					hashMap.put("name",childElement.getFirstChild().getNodeValue());
				}
				//下载地址
				else if (("url".equals(childElement.getNodeName())))
				{
					hashMap.put("url",childElement.getFirstChild().getNodeValue());
				}
			}
		}
		return hashMap;
	}
}