
3.4 使用XPath来定位信息
如果要定位某个XML文档中的一段特定信息,那么,通过遍历DOM树的众多节点来进行查找会显得有些麻烦。XPath语言使得访问树节点变得很容易。例如,假设有如下XML文档:

可以通过对XPath表达式/configuration/database/username求值来得到database中的username的值。
使用Xpath执行下列操作比普通的DOM方式要简单得多:
1)获得文档节点。
2)枚举它的子元素。
3)定位database元素。
4)定位其子节点中名字为username的节点。
5)定位其子节点中的text节点。
6)获取其数据。
XPath可以描述XML文档中的一个节点集,例如,下面的XPath:

描述了根元素gridbag的子元素中所有的row元素。可以用[]操作符来选择特定元素:

这表示的是第一行(索引号从1开始)。
使用@操作符可以得到属性值。XPath表达式

描述了第一行第一个单元格的anchor属性。XPath表达式

描述了作为根元素gridbag的子元素的那些row元素中的所有单元格的anchor属性节点。
XPath有很多有用的函数,例如:

返回gridbag根元素的row子元素的数量。精细的XPath表达式还有很多,请参见http://www.w3c.org/TR/xpath的规范,或者在http://www.zvon.org/xxl/XPathTutorial/General/examples.html上的一个非常好的在线指南。
Java SE 5.0增加了一个API来计算XPath表达式,首先需要从XPathFactory创建一个XPath对象:

然后,调用evaluate方法来计算XPath表达式:

你可以用同一个XPath对象来计算多个表达式。
这种形式的evaluate方法将返回一个字符串。这很适合用来获取文本,比如前面的例子中的username节点中的文本。如果XPath表达式产生了一组节点,请做如下调用:

如果结果只有一个节点,则以XPathConstants.NODE代替:

如果结果是一个数字,则使用XPathConstants.NUMBER:

不必从文档的根节点开始搜索,可以从任意一个节点或节点列表开始。例如,如果你有前一次计算得到的节点,那么就可以调用:


图3-5 计算XPath表达式
程序清单3-7中的程序演示了XPath表达式的求值操作。只要载入一个XML文件,键入一个表达式,选择表达式的类型,点击计算按钮,表达式的结果就会在框架底部显示出来了(见图3-5)。
程序清单3-7 xpath/XPathTester.java




javax.xml.xpath.XPathFactory 5.0
·static XPathFactory newInstance()
返回用于创建XPath对象的XPathFactory实例。
·XPath newXpath()
构建用于计算XPath表达式的XPath对象。
javax.xml.xpath.XPath 5.0
·String evaluate(String expression,Object startingPoint)
从给定的起点计算表达式。起点可以是一个节点或节点列表。如果结果是一个节点或节点集,则返回的字符串由所有文本节点子元素的数据构成。
·Object evaluate(String expression,Object startingPoint,QName resultType)
从给定的起点计算表达式。起点可以是一个节点或节点列表。resultType是XPathConstants类的常量STRING、NODE、NODESET、NUMBER或BOOLEAN之一。返回值是String、Node、NodeList、Number或Boolean。