Android学习笔记42:XML文件解析(DOM方式)
2013-05-07 23:07
369 查看
在上一篇博文《Android学习笔记41:XML文件解析(SAX方式)》中,我们学习了如何使用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文档对象。
以上三个步骤用代码实现如下:
以上代码以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”内容如下:
根据上面的XML文档内容,我们可以创建一个Person类,用来存放<person></person>标签中的内容信息。我们要做的就是解析出<person></person>标签中所包含的id、name、age信息,并将其存储到Person对象中。
如下的代码给出了一种实现的方案:
本篇博文主要介绍如何使用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文档对象。
以上三个步骤用代码实现如下:
//创建DOM解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //创建DOM解析器 DocumentBuilder documentBuilder = factory.newDocumentBuilder(); //解析XML文档,获得该XML文档对应的Document对象 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”内容如下:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>Jack</name> <age>24</age> </person> <person id="2"> <name>Tom</name> <age>25</age> </person> <person id="3"> <name>Bob</name> <age>22</age> </person> </persons>
根据上面的XML文档内容,我们可以创建一个Person类,用来存放<person></person>标签中的内容信息。我们要做的就是解析出<person></person>标签中所包含的id、name、age信息,并将其存储到Person对象中。
如下的代码给出了一种实现的方案:
/* * Function : 使用DOM解析器解析XML文档 * Param : inputStream 以输入流的形式传入XML文档 * Retuen : List<Person> Person对象列表 * Author : 博客园-依旧淡然 */ public static List<Person> readXML(InputStream inputStream) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //创建DOM解析器工厂 DocumentBuilder documentBuilder = factory.newDocumentBuilder(); //创建DOM解析器 Document document = documentBuilder.parse(inputStream); //解析XML文档,获得该XML文档对应的Document对象 Element rootElement = document.getDocumentElement(); //获取XML文档中的根节点<persons> NodeList nodeList = rootElement.getElementsByTagName("person"); //获取根节点所包含的所有子元素<person> List<Person> list = new ArrayList<Person>(); for(int i = 0; i < nodeList.getLength(); i++) { //遍历所有的<person>标签 Element element = (Element)nodeList.item(i); //获取每一个<person>元素对象 Person person = new Person(); person.setId(Integer.parseInt(element.getAttribute("id"))); //获得<person>元素的id属性并存入Person对象 NodeList childNodeList = element.getChildNodes(); //获得<person>下的所有子元素 for(int j = 0; j < childNodeList.getLength(); j++) { //遍历<person>标签下的所有子标签 Node childNode = (Node)childNodeList.item(j); if(childNode.getNodeType() == Node.ELEMENT_NODE) { //当前节点是元素节点 Element childElement = (Element)childNode; if(childElement.getNodeName().equals("name")) { //获取<name>标签中的内容并存入Person对象 person.setName(childElement.getFirstChild().getNodeValue()); } else if(childElement.getNodeName().equals("age")) { //获取<age>标签中的内容并存入Person对象 person.setAge(Integer.parseInt(childElement.getFirstChild().getNodeValue())); } } } list.add(person); //每解析完一个<person>标签,便将Person对象存入Person对象列表 } return list; }
相关文章推荐
- XML文件解析(DOM方式)
- Java之xml文件解析一(DOM方式解析xml文件)
- xml文件--DOM方式解析xml
- mybatis 解析配置文件(一)之XML的DOM解析方式
- DOM方式解析XML配置文件,将数据保存成数组
- 用“XML解析开发包Jaxp”对XML文件进行Dom方式的CRUD操作
- 【慕课笔记】2-1 应用DOM方式解析XML—如何进行 XML 文件解析前的准备工作
- 【慕课笔记】2-3 应用DOM方式解析XML—使用 DOM 解析XML 文件的节点名和节点值
- QT读写XML文件之DOM方式解析XML
- DOM方式解析XML配置文件
- xml文件解析—DOM方式
- python 解析xml 文件: DOM 方式
- Java眼中的XML--文件读取--1 应用DOM方式解析XML
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
- 三种方式解析XML(DOM,Pull,Sax,并带文件编码识别).........................by 私念
- Android学习笔记42-XML文件解析(DOM方式)
- DOM方式解析XML配置文件,将数据保存成数组
- android中解析XML文件方式—DOM SAX PULL
- java 解析dom 树方式来解析XML文件
- 使用JAXP的DOM方式解析XML文档(能力工场)