博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android学习笔记42:XML文件解析(DOM方式)
阅读量:7142 次
发布时间:2019-06-29

本文共 5198 字,大约阅读时间需要 17 分钟。

  在上一篇博文《》中,我们学习了如何使用SAX解析器对XML文件进行解析,从而获得我们想要的有用信息。

  本篇博文主要介绍如何使用DOM解析器对XML文件进行解析。

 

1.DOM树中的对象类型

  使用DOM解析XML文档时,整个XML文档会被转换成一颗DOM树,DOM解析器会将XML文档的节点对应转化成DOM树的每个节点。

  DOM树不仅可以描述XML文档的结构化特征,而且具有对象模型的特征,将XML文档转换成DOM树的过程,就是将文档模型对象化的过程。

  在DOM树中所有节点都是Node对象,Node接口中所包含的一些子接口如图1所示。

图1 Node接口中包含的子接口

  了解了DOM模型中各对象的类型之后,便可以在程序利用这些对象的属性和方法来访问它们所包含的数据了。

 

2.DOM解析器

  通过以下三个步骤可以实现DOM解析器的创建,并完成XML文档模型对象化的过程。

  (1)通过调用DocumentBuilderFactory类的newInstance()方法,创建一个DOM解析器工厂对象。

  (2)通过调用DOM解析器工厂对象的newDocumentBuilder()方法,创建一个DOM解析器对象。

  (3)通过调用DOM解析器对象的parse()方法,完成文档模型对象化的过程,将XML文档解析成Document文档对象。

  以上三个步骤用代码实现如下:

1   2     //创建DOM解析器工厂3   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();4   5     //创建DOM解析器6   DocumentBuilder documentBuilder = factory.newDocumentBuilder();7   8     //解析XML文档,获得该XML文档对应的Document对象9   Document document = documentBuilder.parse(inputStream);

  以上代码以InputStream输入流的形式将XML文档解析成了Document对象。其实,在DocumentBuilder抽象类中包含了多个重载的parse()方法,可以用于将不同形式的XML文档解析成Document对象,具体如下所示。

  (1)Document parse(File f);

  (2)Document parse(InputSourse is);

  (3)Document parse(InputStream is);

  (4)Document parse(InputStream is, String systemId);

  (5)Document parse(String uri);

 

3.使用DOM解析XML文档

3.1获取XML元素

  通过上面的方法,我们已经获得了XML文档对应的Document对象。在Document中包含了以下一些用来访问XML文档中节点的方法。

  (1)Element getDocumentElement();

  (2)Element getElementById(String elementId);

  (3)NodeList getElementByTagName(String tagname);

  其中,getDocumentElement()方法用于获取XML文档的根节点;getElementById()方法用于根据XML元素的ID来获取XML元素;getElementByTagName()方法用于根据XML元素的标签名来获取XML元素。

3.2获取XML元素内容

  Element是Node的最常用的子接口,代表一个XML元素,在Element接口中提供了以下一些方法用来获取XML元素的内容。

  (1)String getAttribute(String name);

  (2)Attr getAttributeNode(String name);

  (3)NodeList getElementByTagName(String name);

  (4)String getTagName();

  (5)boolean hasAttribute(String name);

  其中,getAttribute()方法用于根据属性名获取指定属性值;getAttributeNode()方法用于根据属性名获取指定的属性节点;getElementByTagName()方法用于根据标签名获取由该元素包含的所有子元素所组成的NodeList;getTagName()方法用于获取该元素的标签名;hasAttribute()方法用于判断该元素是否包含某个指定属性。

3.3获取节点数据

  在DOM树中,所有节点都是Node对象,每个Node对象都可能包括nodeName、nodeValue和attributes等属性。但是有一点需要注意,不同的Node节点对这3个属性的支持是不同的。

  在Node接口中提供了以下一些常用的获取节点数据的方法。

  (1)NodeList getChildNodes();       //获取由该节点所包含的所有子节点所组成的NodeList

  (2)Node getFirstChild();           //获取该节点所包含的第一个子节点

  (3)Node getLastChild();           //获取该节点所包含的最后一个子节点

  (4)String getLocalName();           //获取该节点的标签名(本地部分)

  (5)String getNodeName();           //获取该节点的节点名

  (6)String getNodeValue();           //获取该节点的节点值

  (7)Document getOwnerDocument();    //获取该节点所在的Document对象

  (8)Node getParentNode();         //获取该节点的父节点

  (9)String getTextContent();        //获取该节点及其子节点的文本内容

  (10)String getAttributeNode(String name);         //根据属性名获取指定属性值

 

4.实例

  了解了以上这些用于获取XML元素,以及获取XML元素内容的方法之后,便可以通过调用这些方法来完成XML文档的解析了。

这里,我们仍然以上一篇博文中提到的“person.xml”文档为例进行说明。“person.xml”内容如下:

1   
2   
3   
4   
Jack
5   
24
6   
7   
8   
Tom
9   
25
10   
11   
12   
Bob
13   
22
14   
15   

  根据上面的XML文档内容,我们可以创建一个Person类,用来存放<person></person>标签中的内容信息。我们要做的就是解析出<person></person>标签中所包含的id、name、age信息,并将其存储到Person对象中。

  如下的代码给出了一种实现的方案:

1     /* 2      * Function  :    使用DOM解析器解析XML文档 3      * Param     :    inputStream    以输入流的形式传入XML文档 4      * Retuen    :    List
Person对象列表 5 * Author : 博客园-依旧淡然 6 */ 7 public static List
readXML(InputStream inputStream) throws Exception { 8 9 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //创建DOM解析器工厂10 DocumentBuilder documentBuilder = factory.newDocumentBuilder(); //创建DOM解析器11 Document document = documentBuilder.parse(inputStream); //解析XML文档,获得该XML文档对应的Document对象12 Element rootElement = document.getDocumentElement(); //获取XML文档中的根节点
13 NodeList nodeList = rootElement.getElementsByTagName("person"); //获取根节点所包含的所有子元素
14 15 List
list = new ArrayList
();16 for(int i = 0; i < nodeList.getLength(); i++) { //遍历所有的
标签17 Element element = (Element)nodeList.item(i); //获取每一个
元素对象18 Person person = new Person();19 person.setId(Integer.parseInt(element.getAttribute("id"))); //获得
元素的id属性并存入Person对象20 NodeList childNodeList = element.getChildNodes(); //获得
下的所有子元素21 for(int j = 0; j < childNodeList.getLength(); j++) { //遍历
标签下的所有子标签22 Node childNode = (Node)childNodeList.item(j);23 if(childNode.getNodeType() == Node.ELEMENT_NODE) { //当前节点是元素节点24 Element childElement = (Element)childNode;25 if(childElement.getNodeName().equals("name")) { //获取
标签中的内容并存入Person对象26 person.setName(childElement.getFirstChild().getNodeValue());27 } else if(childElement.getNodeName().equals("age")) { //获取
标签中的内容并存入Person对象28 person.setAge(Integer.parseInt(childElement.getFirstChild().getNodeValue()));29 }30 }31 }32 list.add(person); //每解析完一个
标签,便将Person对象存入Person对象列表33 }34 return list;35 }

 

转载地址:http://njgrl.baihongyu.com/

你可能感兴趣的文章
uboot中gd的定义和使用
查看>>
Tcpdump MySQL Query
查看>>
读书笔记-APUE第三版-(8)进程控制
查看>>
JSFL 获取当前脚本路径,执行其他脚本
查看>>
理解JavaScript中的事件处理
查看>>
Win7 公布网站 HTTP 错误 404.4 - Not Found
查看>>
特征选择方法之信息增益
查看>>
mac jdbc连接mysql
查看>>
Activity生命周期的学习以及Logcat的使用
查看>>
Longest Valid Parentheses leetcode java
查看>>
Android的两种菜单
查看>>
poj 1218 THE DRUNK JAILER
查看>>
WordPress SEO ☞ WordPress网站终极优化指南
查看>>
Environment 常用方法
查看>>
【TYVJ】1338 QQ农场(最大流+最大权闭合图)
查看>>
解决Python2.7的UnicodeEncodeError: 'ascii' codec can’t encode异常错误
查看>>
最近在准备开发进销存管理系统
查看>>
TCP/IP协议
查看>>
【C#】Entity Framework 增删改查和事务操作
查看>>
原创:谨以此文怀念曾经的妹妹
查看>>