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>
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;
}
}