使用Dom解析XML文件

Android开发中有SAX、DOM、PULL三种xml解析方式,本文介绍如何使用DOM方式解析xml文件,在下一篇文章中,将介绍如何使用DOM创建和写入xml文件。

DOM,文档对象模型是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。

<?xml version="1.0" encoding="UTF-8"?>
<languages cat="it">
	<lan id="1">
		<name>Java</name>
		<ide>Eclipse</ide>
	</lan>
	<lan id="2">
		<name>C#</name>
		<ide>Visual Studio</ide>
	</lan>
	<lan id="3">
		<name>Swift</name>
		<ide>Xcode</ide>
	</lan>
</languages>

上面就是我要解析的xml文件,我将其命名languages.xml文件,保存在assets文件夹下。

使用DOM解析xml文件,需要根据xml文件,获取文档Document,获取Document的方式如下:

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(getAssets().open("languages.xml"));
首先调用DocumentBuilderFactory类的静态方法newInstance()获取一个DocumentBuilderFactory对象builderFactory,这个对象有什么用呢?通过查看源码注释:

/**
 * Defines a factory API that enables applications to obtain a
 * parser that produces DOM object trees from XML documents.
 *
 * @author <a href="Jeff.Suttor@Sun.com">Jeff Suttor</a>
 * @version $Revision: 884950 $, $Date: 2009-11-27 10:46:18 -0800 (Fri, 27 Nov 2009) $
 */
这段注释的意思是定义一个factory API builder,调用builder的parse()方法,使当前这个应用从XML文件解析器获取一个DOM对象树document。这个DOM对象树代表了被解析xml文件。至此,程序已经将被解析的xml文件解析为DOM对象,可以操作DOM获取xml文件的具体内容。

读取xml文件的内容时,需要获取document的一个属性对象Element:

Element element = document.getDocumentElement();//package org.w3c.dom;
我们需要的是org.w3c.dom包中的Element类,查看Document类源码注释:

 / ** This is a convenience attribute that allows direct access to the child
   * node that is the document element of the document.
   */
这段注释的大致意思是,该Element是允许应用程序直接访问文档元素的一个属性,相当于xml文件的根元素,我们可以通过获取该document的属性Element,访问该document对应的xml文件的所有子元素。
获取到document的element属性后,就可以读取xml文件的内容了。通过调用element的getElementsByTagName(String name)方法可以读取文档的节点:

NodeList list = element.getElementsByTagName("lan");
通过源码可知,element的getElementsByTagName 返回的是一个NodeList列表,注释:

  /**
     * Returns a <code>NodeList</code> of all descendant <code>Elements</code>
     * with a given tag name, in document order.
     * @param name The name of the tag to match on. The special value "*"
     *   matches all tags.
     * @return A list of matching <code>Element</code> nodes.
     */
该方法是根据元素名tag name 按文档中的顺序返回一个包含子元素的NodeList对象,也就是说,调用一次该方法,就可以得到所有元素标签为name的元素,我们可以通过返回的NodeList对象获取每个字元素的内容。

for (int i = 0; i < list.getLength(); i++) {
	Element lan = (Element) list.item(i);
	System.out.println("id " + lan.getAttribute("id"));
	System.out.println("name " + lan.getElementsByTagName("name").item(0).getTextContent());
	System.out.println("ide " + lan.getElementsByTagName("ide").item(0).getTextContent());
	System.out.println("*************************************");
}
遍历返回的NodeList列表,对于列表的每一个Element类型元素,可以调用getAttribute(String name)元素获取对应的属性值,调用getElementsByTagName(String name)方法获取字元素列表。由于文中给定的xml文件中,每一个lan标签中都只包含一个name和一个ide标签,所以,在上面的程序中,调用NodeList对象的item(0)方法就可以返回该lan标签下的name元素和ide元素对应的element对象,并调用getTextContent()方法,获取其对应的内容。

关于DOM解析xml就这些内容,有疑问请留言,下一篇将介绍使用DOM方式创建和写入xml文件。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值