用XPath解析XML文档(一)

原文作者: Deepak Vohra
       通常一般用 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 来检索。
Element article = (Element) (xPath.evaluate( " /catalog/journal/article[2]/title " , inputSource,  XPathConstants.NODE));
 
在上面的代码段中, xPath javax.xml.xpath.XPath 的一个类对象, inputSource XML 文档的一个 InputSource 对象。用 org.w3c.dom 包的 getter 方法查检索 journal 节点下的二级节点 article 的代码段如下:
Document document;
NodeList nodeList
= document.getElementsByTagName( " journal " );
Element journal
= (Element)(nodeList.item( 0 ));
NodeList nodeList2
= journal.getElementsByTagName( " article " );
Element article
= (Element)nodeList2.item( 1 );
 
此外,用 XPath 表达式,一个属性节点可以被直接定位,而 getter 方法则在定位属性节点前必须先确定元素节点。
例如: article 节点 date January-2004 level 属性值,用 XPath 表达式来检索:
String level  =  
    xPath.evaluate(
" /catalog/journal/article[@date='January-2004']/@level " , inputSource);
 
与此对应的, org.w3c.dom 包要求你为 article 节点先得到 org.w3c.dom.Element 对象,然后再得到 level 属性:
String level = article.getAttribute( " level " );
 
总论
在这篇教程中,一个 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
import  javax.xml.xpath. * ;
 
XPath XPathExpression 接口中的 evaluate 方法用来解析 XML 文档, XPathFactory 类用来创建 XPath 对象,使用 XPathFactory 类的静态 newInstance 方法来创建 XPathFactory 对象。
XPathFactory factory = XPathFactory.newInstance();
 
XPathFactory 对象的 newXPath 方法来创建 XPath 对象。
XPath xPath = factory.newXPath();
 
XPath 对象的 compile 方法来创建和编译 XPath 表达式,按照示例,定位 article title date 属性设置成 January-2004 。在 XPath 表达式中的属性以 @ 标记。关于 XPath 表达式的详细信息,可查询 XPath specification
XPathExpression xPathExpression =
    xPath.compile(
" /catalog/journal/article[@date='January-2004']/title " );
 
为示例文档创建 InputSource ,一个 InputSource 是一个 XML 实体的输入类, XPathExpression 接口的 evaluate 方法计算一个 InputSource org.w3c.dom.Node , org.w3c.dom.NodeList / org.w3c.dom.Document 的结点或结点集。
InputSource inputSource  =   new  InputSource( new  FileInputStream(xmlDocument)));
 
xmlDocument 是示例文档的 java.io.File 对象。
File xmlDocument  =   new  File( " c:/catalog/catalog.xml " );
 
用示例文档的 InputSource 来处理 XPath 表达式。
String title  =   xPathExpression.evaluate(inputSource);
 
XPath 表达式处理的结果是标题: Design service-oriented architecture frameworks with J2EE technology. XPath 对象也可以直接在一个 XML 文档中计算 XPath 表达式的值而不用先编译。创建一个 InputSource
inputSource  =   new  InputSource( new  FileInputStream(xmlDocument)));
 
作为示例,计算 journal 元素中 publisher 结点的值。
String publisher  =   xPath.evaluate( " /catalog/journal/@publisher " , inputSource);
 
XPath 表达式处理的结果是属性值: IBM developerWork s, XPath 中的 evaluate 方法也可用来计算结点集。例如,定位与 XML 文档中 article 元素结点一致的结点或结点集。创建代表结点集的 XPath 表达式。
String expression = " /catalog/journal/article " ;
 
在示例文档中用 XPath 对象的 evaluate 方法定位 article 的结点集。
NodeSet nodes  =  (NodeSet) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);
 
XpathConstants.NODESET 指定了 evaluate 的返回类型为 NodeSet 。返回类型也可以设置为 NODE , STRING , BOOLEAN NUMBER NodeSet 类实现了 NodeList 接口。为了解析结点集中的结点,把 NodeSet 转换成 NodeList
NodeList nodeList = (NodeList)nodes;
 
因而, XML 文档中的结点被选择和处理而不用遍历 org.w3c.dom API getter 方法。示例程序 XPathEvaluator.java JDK5.0 XPath 类来解析 XML 文档。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值