XPath 概述
XPath語言提供了用於從 XML文檔選擇節點的簡單、簡潔的語法。XPath還提供了將XML文檔對象模型(DOM)樹中的節點轉換為布爾值、double值或字元串值的規則。XPath是W3C定義的語言和正式的 W3C推薦,W3C擁有XMLPathLanguage(XPath)Version1.0規範。
XPath誕生於1999年,作為對 XSLT和XPointer語言的補充,但近來已成為流行的獨立語言,因為單個XPath表達式可用於替代多行DOMAPI代碼。
接口摘要
XPathXPath提供了對XPath計算環境和表達式的訪問。
XPathExpressionXPathExpression提供了對編譯後的XPath表達式的訪問。
XPathFunctionXPathFunction提供了對XPath函式的訪問。
XPathFunctionResolverXPathFunctionResolver提供了對用戶定義的XPathFunction集的訪問。
XPathVariableResolverXPathVariableResolver提供了對用戶定義的XPath變數集的訪問。
類摘要
XPathConstantsXPath常量。
XPathFactoryXPathFactory實例可用於創建XPath對象。
異常摘要
XPathExceptionXPathException表示通用XPath異常。
XPathExpressionExceptionXPathExpressionException表示XPath表達式中的錯誤。
XPathFactoryConfigurationExceptionXPathFactoryConfigurationException表示XPathFactory環境中的配置錯誤。
XPathFunctionExceptionXPathFunctionException表示XPath函式的錯誤。
XPath 表達式
XPath表達式由一個位置路徑和一個或多個可選的謂詞組成。表達式還可以包含XPath變數。
以下是一個簡單的XPath表達式的示例:
/foo/bar
此示例將選擇如下所示的XML文檔中的<bar>元素:
<foo>
<bar/>
</foo>
表達式/foo/bar是位置路徑的一個示例。雖然XPath位置路徑類似於Unix-style檔案系統路徑,但它們存在重要的區別,即XPath表達式返回與表達式匹配的所有節點。因此,/foo/bar表達式將選中以下文檔中的所有三種<bar>元素:
<foo>
<bar/>
<bar/>
<bar/>
</foo>
特殊位置路徑操作符//選擇位於 XML文檔中任何深度的節點。以下示例選擇所有<bar>元素,不管它們在文檔中處於什麼位置:
//bar
通配符*用於選擇所有元素節點。以下示例選擇<foo>元素的所有子元素:
/foo/*
除元素節點外,XPath位置路徑還可用於尋找屬性節點、文本節點、注釋節點和指令處理節點。下表給出了每種節點類型的位置路徑的示例:
位置路徑描述
/foo/bar/@id選擇<bar>元素的屬性id
/foo/bar/text()選擇<bar>元素的文本節點。轉義和非轉義字元數據之間沒有區別。
/foo/bar/comment()選擇<bar>元素中包含的所有注釋節點。
/foo/bar/processing-instruction()選擇<bar>元素中包含的所有指令處理節點。
謂詞允許修改XPath位置路徑所選中的節點。謂詞的形式為[expression]。以下示例選擇包含值為true的 include屬性的所有<foo>元素:
//foo[@include="true"]
謂詞可互相追加以進一步修改表達式,例如:
//foo[@include="true"][@mode="bar"]
使用XPathAPI
以下示例演示了使用XPath API來選擇一個或多個來自 XML文檔的節點:
XPathxpath=XPathFactory.newInstance().newXPath();
Stringexpression="/widgets/widget";
InputSourceinputSource=newInputSource("widgets.xml");
NodeListnodes=(NodeList)xpath.evaluate(expression,inputSource,XPathConstants.NODESET);
XPath表達式和類型
雖然XPath表達式選擇的是XML文檔的節點,但XPathAPI允許將選中的節點組合到以下其他數據類型中:
布爾值
數字
字元串
用於計算表示式的方法調用中的QName參數指定了所需的返回類型,其中方法調用要么是調用XPathExpression.evalute(...),要么是調用XPath.evaluate(...)便捷方法之一。允許的QName值指定為XPathConstants類中的常量,它們是:
XPathConstants.NODESET
XPathConstants.NODE
XPathConstants.STRING
XPathConstants.BOOLEAN
XPathConstants.NUMBER
當請求 Boolean返回類型時,如果選中了一個或多個節點,則返回Boolean.TRUE,否則返回Boolean.FALSE。
String返回類型是從文本節點、注釋節點或指令處理節點檢索字元數據的便捷方法。當用於元素節點上時,返回子文本節點的值。
Number返回類型嘗試將節點的文本組合到 double數據類型。
XPath 上下文
XPath位置路徑可以相對於文檔中的特殊節點,稱為context。考慮以下XML文檔:
<widgets>
<widget>
<manufacturer/>
<dimensions/>
</widget>
</widgets>
可以通過以下XPathAPI代碼選擇<widget>元素:
//parsetheXMLasaW3CDocument
DocumentBuilderbuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Documentdocument=builder.parse(newFile("/widgets.xml"));
XPathxpath=XPathFactory.newInstance().newXPath();
Stringexpression="/widgets/widget";
NodewidgetNode=(Node)xpath.evaluate(expression,document,XPathConstants.NODE);
通過引用<widget>元素,現在可以編寫相對XPath表達式來選擇<manufacturer>子元素:
XPathxpath=XPathFactory.newInstance().newXPath();
Stringexpression="manufacturer";
NodemanufacturerNode=(Node)xpath.evaluate(expression,widgetNode,XPathConstants.NODE);
AuthorBenGalbraith
AuthorNormanWalsh
AuthorJeffSuttor
SeeXMLPathLanguage(XPath)Version1.0
Since1.5