1.DOM树中的对象类型
使用DOM解析XML文档时,整个XML文档会被转换成一颗DOM树,DOM解析器会将XML文档的节点对应转化成DOM树的每个节点。
DOM树不仅可以描述XML文档的结构化特征,而且具有对象模型的特征,将XML文档转换成DOM树的过程,就是将文档模型对象化的过程。
在DOM树中所有节点都是Node对象,Node接口中所包含的一些子接口如图1所示。
图1Node接口中包含的子接口
了解了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)Documentparse(Filef);
(2)Documentparse(InputSourseis);
(3)Documentparse(InputStreamis);
(4)Documentparse(InputStreamis,StringsystemId);
(5)Documentparse(Stringuri);
3.使用DOM解析XML文档
3.1获取XML元素
通过上面的方法,我们已经获得了XML文档对应的Document对象。在Document中包含了以下一些用来访问XML文档中节点的方法。
(1)ElementgetDocumentElement();
(2)ElementgetElementById(StringelementId);
(3)NodeListgetElementByTagName(Stringtagname);
其中,getDocumentElement()方法用于获取XML文档的根节点;getElementById()方法用于根据XML元素的ID来获取XML元素;getElementByTagName()方法用于根据XML元素的标签名来获取XML元素。
Element是Node的最常用的子接口,代表一个XML元素,在Element接口中提供了以下一些方法用来获取XML元素的内容。
(1)StringgetAttribute(Stringname);
(2)AttrgetAttributeNode(Stringname);
(3)NodeListgetElementByTagName(Stringname);
(4)StringgetTagName();
(5)booleanhasAttribute(Stringname);
其中,getAttribute()方法用于根据属性名获取指定属性值;getAttributeNode()方法用于根据属性名获取指定的属性节点;getElementByTagName()方法用于根据标签名获取由该元素包含的所有子元素所组成的NodeList;getTagName()方法用于获取该元素的标签名;hasAttribute()方法用于判断该元素是否包含某个指定属性。
3.3获取节点数据
在DOM树中,所有节点都是Node对象,每个Node对象都可能包括nodeName、nodeValue和attributes等属性。但是有一点需要注意,不同的Node节点对这3个属性的支持是不同的。
(1)NodeListgetChildNodes(); //获取由该节点所包含的所有子节点所组成的NodeList
(2)NodegetFirstChild(); //获取该节点所包含的第一个子节点
(3)NodegetLastChild(); //获取该节点所包含的最后一个子节点
(4)StringgetLocalName(); //获取该节点的标签名(本地部分)
(5)StringgetNodeName(); //获取该节点的节点名
(6)StringgetNodeValue(); //获取该节点的节点值
(7)DocumentgetOwnerDocument(); //获取该节点所在的Document对象
(8)NodegetParentNode(); //获取该节点的父节点
(9)StringgetTextContent(); //获取该节点及其子节点的文本内容
(10)StringgetAttributeNode(Stringname); //根据属性名获取指定属性值
4.实例
了解了以上这些用于获取XML元素,以及获取XML元素内容的方法之后,便可以通过调用这些方法来完成XML文档的解析了。
这里,我们仍然以上一篇博文中提到的“person.xml”文档为例进行说明。“person.xml”内容如下: