原文作者:
Deepak Vohra
Element article
=
(Element) (xPath.evaluate(
"
/catalog/journal/article[2]/title
"
, inputSource, XPathConstants.NODE));
Document document;
NodeList nodeList
=
document.getElementsByTagName(
"
journal
"
);
Element journal
=
(Element)(nodeList.item(
0
));
NodeList nodeList2
=
journal.getElementsByTagName(
"
article
"
);
Element article
=
(Element)nodeList2.item(
1
);
String level
=
xPath.evaluate(
"
/catalog/journal/article[@date='January-2004']/@level
"
, inputSource);
String level
=
article.getAttribute(
"
level
"
);
import
javax.xml.xpath.
*
;
XPathFactory factory
=
XPathFactory.newInstance();
XPath xPath
=
factory.newXPath();
XPathExpression xPathExpression
=
xPath.compile(
"
/catalog/journal/article[@date='January-2004']/title
"
);
InputSource inputSource
=
new
InputSource(
new
FileInputStream(xmlDocument)));
File xmlDocument
=
new
File(
"
c:/catalog/catalog.xml
"
);
String title
=
xPathExpression.evaluate(inputSource);
inputSource
=
new
InputSource(
new
FileInputStream(xmlDocument)));
String publisher
=
xPath.evaluate(
"
/catalog/journal/@publisher
"
, inputSource);
String expression
=
"
/catalog/journal/article
"
;
NodeSet nodes
=
(NodeSet) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);
NodeList nodeList
=
(NodeList)nodes;
通常一般用
API
包
org.w3c.dom
中的
getter
方法来解析
XML
文档
,
但
J2SE5
中也提供了
javax.xml.xpath
包来用
XPath
解析
XML. JDOM
类
org.jdom.xpath.XPath
也提供了方法用
XPath
表达式来选择
XML
文档节点
,
这个
XPath
表达式由
XML
文档的一个或一组节点的地址路径组成。
用一个
XPath
表达式来解析
XML
文档比用
getter
方法更有效率,因为使用
XPath,
可以定位一个元节点而不需遍历整个节点列表。而使用
getter
方法来检索节点列表,必须要遍历检索每个元节点的值。例如,在示例
XML
文档中的
journal
节点的第二个节点
article
可以使用
XPath
来检索。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在上面的代码段中,
xPath
是
javax.xml.xpath.XPath
的一个类对象,
inputSource
是
XML
文档的一个
InputSource
对象。用
org.w3c.dom
包的
getter
方法查检索
journal
节点下的二级节点
article
的代码段如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
此外,用
XPath
表达式,一个属性节点可以被直接定位,而
getter
方法则在定位属性节点前必须先确定元素节点。
例如:
article
节点
date
为
January-2004
的
level
属性值,用
XPath
表达式来检索:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
与此对应的,
org.w3c.dom
包要求你为
article
节点先得到
org.w3c.dom.Element
对象,然后再得到
level
属性:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
总论
在这篇教程中,一个
XML
示例文档被
J2SE5.0
的
XPath
类和
JDOM
的
XPath
类解析。
XML
文档节点用
XPath
表达式定位。依赖于
XPath
表达式,结点要么是
org.w3c.dom.Element
要么是
org.w3c.dom.Attribute
。示例文档
catalog.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns:journal="http://www.w3.org/2001/XMLSchema-Instance" >
<journal:journal title="XML" publisher="IBM developerWorks">
<article journal:level="Intermediate"
date="February-2003">
<title>Design XML Schemas Using UML</title>
<author>Ayesha Malik</author>
</article>
</journal:journal>
<journal title="Java Technology" publisher="IBM
developerWorks">
<article level="Advanced" date="January-2004">
<title>Design service-oriented architecture
frameworks with J2EE technology</title>
<author>Naveen Balani </author>
</article>
<article level="Advanced" date="October-2003">
<title>Advance DAO Programming</title>
<author>Sean Sullivan </author>
</article>
</journal>
</catalog>
示例文档有一个命名空间的定义,
xmlns:journal="http://www.w3.org/2001/XMLSchema-instance"
,
以
journal
为前缀的命名空间。
本文篇章结构如下:
1.
初始准备;
2.
用
JDK 5.0 XPath
类解析;
3.
用
JDOM XPath
类解析;
初始准备
为获取
J2SE 5.0 XPath
的支持,
javax.xml.xpath
需要设置在
CLASSPATH
中,安装新版本的
J2SE 5.0 SDK
。为了用
JDK 5.0 XPath
解析
XML
文档,
<JDK5.0>
/jre/lib/rt.jar
文件如果在
CLASSPATH
中不存在则添加
到
CLASSPATH
变量,
<JDK5.0>
是
JDK
的安装目录。
org.apache.xpath.NodeSet
类也被要求在
CLASSPATH
中,安装
Xalan-Java
,解开
xalan-j-current-bin.jar
到一个目录,添加
<Xalan>
/bin/xalan.jar
到
CLASSPATH
,
<Xalan>
是
Xalan-Java
的安装目录。
为了用
JDOM XPath
类的来解析文档,
JDOM API
类需要在
CLASSPATH
中,安装
JDOM
,解压
jdom-b9.zip
到安装目录,
<JDOM>
/jdom-b9/build/jdom.jar
,
<JDOM>
/jdom-b9/lib/saxpath.jar
,
<JDOM>
/jdom-b9/lib/jaxen-core.jar
,
<JDOM>
/jdom-b9/lib/jaxen-jdom.jar
和
<JDOM>
/jdom-b9/lib/xerces.jar
到
CLASSPATH
变量,
<JDOM>
是
JDOM
安装目录。
用
JDK 5.0 XPath
类解析
在
J2SE 5.0
中
javax.xml.xpath
包用类和接口来解析
XML
文档。在
JDK5.0
中一些类的接口列表如下:
Class/Interface
|
Description
|
XPath
(interface)
|
Provides access to the XPath evaluation environment. Provides the
evaluate
methods to evaluate XPath expressions in an XML document.
|
XPathExpression
(interface)
|
Provides the
evaluate
methods to evaluate compiled XPath expressions in an XML document.
|
XpathFactory
(class)
|
Used to create an XPath object.
|
在本节中,示例
XML
文档被
javax.xml.xpath.Xpath
类处理。首先,导入
javax.xml.xpath
:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在
XPath
和
XPathExpression
接口中的
evaluate
方法用来解析
XML
文档,
XPathFactory
类用来创建
XPath
对象,使用
XPathFactory
类的静态
newInstance
方法来创建
XPathFactory
对象。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
用
XPathFactory
对象的
newXPath
方法来创建
XPath
对象。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
用
XPath
对象的
compile
方法来创建和编译
XPath
表达式,按照示例,定位
article
的
title
将
date
属性设置成
January-2004
。在
XPath
表达式中的属性以
@
标记。关于
XPath
表达式的详细信息,可查询
XPath specification
。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
为示例文档创建
InputSource
,一个
InputSource
是一个
XML
实体的输入类,
XPathExpression
接口的
evaluate
方法计算一个
InputSource
或
org.w3c.dom.Node
,
org.w3c.dom.NodeList
/
org.w3c.dom.Document
的结点或结点集。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
xmlDocument
是示例文档的
java.io.File
对象。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
用示例文档的
InputSource
来处理
XPath
表达式。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
XPath
表达式处理的结果是标题:
Design service-oriented architecture frameworks with J2EE technology.
XPath
对象也可以直接在一个
XML
文档中计算
XPath
表达式的值而不用先编译。创建一个
InputSource
:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
作为示例,计算
journal
元素中
publisher
结点的值。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
XPath
表达式处理的结果是属性值:
IBM developerWork
s, XPath
中的
evaluate
方法也可用来计算结点集。例如,定位与
XML
文档中
article
元素结点一致的结点或结点集。创建代表结点集的
XPath
表达式。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在示例文档中用
XPath
对象的
evaluate
方法定位
article
的结点集。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
XpathConstants.NODESET
指定了
evaluate
的返回类型为
NodeSet
。返回类型也可以设置为
NODE
,
STRING
,
BOOLEAN
或
NUMBER
。
NodeSet
类实现了
NodeList
接口。为了解析结点集中的结点,把
NodeSet
转换成
NodeList
。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
因而,
XML
文档中的结点被选择和处理而不用遍历
org.w3c.dom
API
的
getter
方法。示例程序
XPathEvaluator.java
用
JDK5.0 XPath
类来解析
XML
文档。