XML 现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关
性,给数据集成与交互带来了极大的方便. W3C 定义了 XML 的语法以及 XML 的读写操作
方法,任何计算机高级语言都可以实现对 XML 的读写操作, 本节将学习 Java 对 XML 的
读写操作。
1. 两种解析方式
XML 在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析
方式有两种,一种是 SAX(Simple API for XML),另一种是 DOM(Document Object
Model)。
þSAX: 用于 XML 处理的简单 API
基于事件驱动的XML 处理技术,使用SAX 解析XML 时,程序从XML 文档的开头
逐字逐句的读取,在此过程中激发事件(比如:文档开始,文档结束,元素开始,元素结
束等事件),由应用程序对 XML 数据进行处理。例如,startElement()在每次 SAX 解析
器遇到元素的起始标记时激发。endElement() 在元素的结束标记时激发。
þDOM:XML 文档树结构的解析
DOM 把 XML 文档中的元素、文本、属性视为节点,组成一种树结构,称为 DOM
树,通过DOM 树可以访问所有的节点。也可以修改节点的内容,添加、删除节点等操作。
W3C Dom 是 W3C 推荐的用于解析的 XML 文件解析模型。W3C 规定了 DOM 解析的接
口和对象,用于对DOM 进行标准操作。
两者的比较:
Java 有丰富的组件提供对 XML 进行操作,常见的有 4 中操作方式:JAXP、JDOM、
DOM4J、JAXB 等。他们在不同的领域对 XML 进行方便操作。
1.1 解析用的 xml 文档
为了演示各种操作的方式,需要准备一个 xml 文档

2. JAXP (Java APIfor XML Processing )
JAXP 是使用 JavaAPI 对 XML 进行处理的一种规范,它提供接口来操作 SAX 和 DOM。
JAXP 的 API 已经包含在 JDK 中,它包含了三个包:
org.w3c.dom:
W3C 推荐的用于 XML 操作的标准文档对象模型的接口。
org.xml.sax:
用于对XML 进行语法分析的事件驱动的 XML 简单API(SAX)
Javax.xml.parsers:
解析器工厂工具,程序员获得并配置特殊的语法分析器。
W3C DOM 的常用对象及其方法有:

下面开始解析上面的xml 文档,新建一个 java 项目,不需要引入任何 jar 包,因为 jdk 中已
经自带JAXP 的API
2.1 加载 XML 文件
一般情况下我们将xml 文件放到项目的src 目录中,经过编译MyEclipse 工具编译
以后,放到了bin 目录中,也就是程序运行的 classpath 路径中,从classpath 路径下加
载一个文件(不管是什么文件),可以使用 Class 类中的 getResourceAsStream 方法,
这个方法返回一个InputStream 文件流
2.2 获得文档解析器工厂
2.3 从工厂中获得解析器

2.4 取得文档
注意:这里为了演示方便,没有处理异常
2.5 获取根元素

2.6 使用递算法归遍历根元素下所有的子元素
parseElement 方法是遍历一个元素中的信息。
首先是元素的标记名称,这可以使用 getNodeName 方法来获取。接着获取属性,
getAttributes()方法可以获取所有的属性,然后遍历每一个属性,显示属性的名称和值
接着考察该元素下所有的子元素,如果子元素只有一个并且节点类型是文本节点,判
断方法为:
nodeList.getLength()==1&&nodeList.item(0).getNodeType()==Node.TEXT_NODE),则显示文
本信息,方法调用结束(return),否则取出元素中所有的子元素,递归调用该方法继续遍
历元素中的信息。

①由于 xml 文件是格式化的,带有空格和回车换行符,JAXP 把这些字符也解析为一
个文本节点(CharacterData),此处在遍历 XML 文件的节点时,需要把 Element 元素
检索出来。
2.7 在 main 方法中调用递归
输出结果:

2.8DOM 元素的创建和修改
关于DOM 元素的创建和修改方式与我们在 javaScript DOM 编程中使用的方式是一
样的,这里不再演示
2.9 小结
JAXP 是一个规范接口,任何符合 JAXP 接口的解析器都可以进行统一的 XML 解析,
W3C 没有定义 DOM 对象输出为 XML 文件。JAXP 根据 W3C 规范而定义操作接口,利
用JAXP 对XML 进行解析,不依赖任何第三方的 Jar 包,但是W3C 定义的XML 操作需
要顾及各种语言的通用性,因此操作比较麻烦,同时 org.w3c.dom 包中的解析器也没有
提供对DOM 对象的输出。如果把DOM 对象输出为XML 文件,需要程序员根据IO 流,
定义方法进行输出,也可以借助其他的 XML 操作组件操作,比如 JDOM 组件。
3. JDOM 操作 XML
JDOM 是一个开源项目,它基于树型结构,利用 JAVA 语言的诸多特性(方法重载、
集合概念以及映射),把SAX 和DOM 的功能有效地结合起来,实现对 XML 文档解析、
生成、序列化等多种操作
JDOM 全称 java Document Object Model,java 文档对象模型。它用于快速开发
XML 应用程序。JDOM 为 java 程序员提供了一套简单易用的操作 XML 的 API。
3.1 下载 JDOM
我 们 可 以 在 http://www.jdom.org 下 载 JDOM 提 供 的 jar 包 , 这 里 下 载 的 是
JDOM1.1.1 版本
将解压后得到的build 目录下的jdom.jar 加入到我们项目的classpath 中就可以使用了
3.2 JDOM 的主要类
JDOM 的 jar 文件中的类主要集中在 7 个包中:
org.jdom
这个包中的类对应到XML 文档中的各个组成部分。如 元素,属性,文本节点,注释
等等。
org.jdom.input
这个包中的类表示读取XML 文档的类
org.jdom.output
这个包中的类表示输出XML 文档的类
org.jdom.adapters
包含了与dom 适配的java 类
org.jdom.filter
包含了xml 文档的过滤器类
org.jdom.transform
包含了将jdom xml 文档接口转换为其他xml 文档接口
org.jdom.xpath
包含了对xml 文档xpath 操作的类
Document 表示文档,Element 表示元素,DocType 表示文档类型,Comment 表示注
释内容,ProcessingInstruction表示处理指令,Text 表示文本节点,Atrribute 表示属性
JDOM 对 XML 解析时,省略了对元素之间的空格、TAB 符、回车换行符等特殊文本
的解析,使操作更加方便、快捷。
3.3 创建解析器
在JDOM 中可以使用SAX 解析器对XML 进行解析、也可以使用DOM 解析器进行解
析,解析的结果都会生成一棵节点树(Document 对象),由 JDOM 进行维护,SAX 解析
器解析速度比DOM 解析器快。由于JDOM 生成的节点树与W3C 的DOM 无关,因此普
遍使用 SAX 解析器对 XML 进行解析。JDOM 提供了 SAXBuilder 和 DomBuilder,两个解析器。这里我们使用 SAXBuilder

3.4 获取 Document 对象
通过SaxBuilder 的builder 方法获得一个Document 对象,注意这个对象就是JDOM
封装过的Document,注意要与W3C 中规定的document 的区别。
3.5 获取根元素

3.6 使用递归算法遍历(1)
首先获取元素的名称,然后去的元素的属性。JDOM 将元素的属性封装成了 Attribute
对象。
然后取得其孩子节点,如果没有孩子节点,而且元素文本内容不为空,则取出文本内容
(在W3C DOM 中被称为文本节点),如:<name>张三</name>像这样的元素 JDOM
认为没有孩子节点,而W3C DOM 则认为有孩子节点,节点的类型为文本节点,这里我们
需要加以区别。如果还有孩子几点,则遍历这些孩子节点,递归调用 parseElement 方法

3.6 在 main 方法中调用自定义方法:parseElement

3.7 增加元素
增加一个编号为 3,姓名为王五,性别为女,生日为系统当前时间的元素,并保存到
xml 文档中。
注意:保存后的结果放在了 bin 目录中,这里使用的Class 类中的getResource 方法,
该方法的参数是一个文件在 classpath 中的路径,返回一个文件的 URL,通过调用URL 的
getFile 方法可以获取文件的完成的路径名,这个路径经过了 URL 编码,如果路径中带有中
文字符,就需要进行URL 解码。
4. XPath
XPath 是一种在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素
和属性进行遍历。XPath 是 W3C XSLT 标准的主要内容之一,它使用路径表达式在 XML
文档中进行导航。XPath 含有丰富的内建函数,这些函数用于字符串、数值,日期和时间
比较,节点和 QName 处理、序列处理、逻辑处理等。QName 是指一个合法的 XML 元
素,由命名空间(namespace)前缀(prefix)以及冒号(:)和一个元素名称构成。
4.1XPath 术语
节点(Node)
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以
及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
基本值(或称原子值,Atomic value)
无父节点(根节点)或者无子节点(叶子节点)的节点
项目(Item)
节点和基本值的总称。
父节点(parent)
每一个元素有一个父节点。
子节点(children)
每一个元素有零个、1 个或者多个子节点。
兄弟节点(sibling)[`sibliŋ]
拥有相同父节点的节点。
先辈(Ancestor)[`aensistə]
某节点的父节点,父节点的父节点……
后代(Descendant)[di’sendənt]
某节点的子节点,子节点的子节点……
4.2 路径表达式
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径
(path)来选取的。
以上面的 xml 文档为例,下面列出了表达式的意义
4.3 查找某个特定的节点或者包含某个指定的值的节点
谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。
下面是一些使用的例子:
/employees/employee[1]
选取 employees 下的第一个 employee 元素
/employees/employee[last()]
选取 employees 下的最后一个 employee 元素
/employees/employee[last()-1]
选取 employees 下的倒数第二个 employee 元素
/employees/employee[position()<3]
选取 employees 下的第 1 个和第 2 个 employee 元素
//employee[@id]
选取所有拥有名为 id 的属性的 employee 元素。
//employee [@id='2']
选取所有拥有名为 id 的属性,并且值为 2 的 employee 元素。
/employees/employee[sex=’男’]
选取所有 employee 元素,并且其中的 sex 元素的值为‘男’
/employees/employee[sex=’男’]/name
选取所有 employee 下的 name 元素,并且其中的 sex 元素的值为‘男’
4.5 使用通配符
XPath 中可以使用通配符:*、@*、node()等:
例子
JDOM 中提供了 Xpath 对象来封装 xpath 表达式,然后调用 selectNodes 方法,该
方法需要传递一个 Document 对象,这样就可以在文档中选出我们想要的元素了。在下面
的例子中,我们修改 “张三”的生日为当前时间.
思路:我们需要修改的是生日,也就是 birthday 元素,所以我们可以使用表达式:
/employees/employee[name=’张三’]/birthday 表达式