官术网_书友最值得收藏!

3.4 使用XPath來定位信息

如果要定位某個XML文檔中的一段特定信息,那么,通過遍歷DOM樹的眾多節(jié)點來進行查找會顯得有些麻煩。XPath語言使得訪問樹節(jié)點變得很容易。例如,假設(shè)有如下XML文檔:

可以通過對XPath表達式/configuration/database/username求值來得到database中的username的值。

使用Xpath執(zhí)行下列操作比普通的DOM方式要簡單得多:

1)獲得文檔節(jié)點。

2)枚舉它的子元素。

3)定位database元素。

4)定位其子節(jié)點中名字為username的節(jié)點。

5)定位其子節(jié)點中的text節(jié)點。

6)獲取其數(shù)據(jù)。

XPath可以描述XML文檔中的一個節(jié)點集,例如,下面的XPath:

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

這表示的是第一行(索引號從1開始)。

使用@操作符可以得到屬性值。XPath表達式

描述了第一行第一個單元格的anchor屬性。XPath表達式

描述了作為根元素gridbag的子元素的那些row元素中的所有單元格的anchor屬性節(jié)點。

XPath有很多有用的函數(shù),例如:

返回gridbag根元素的row子元素的數(shù)量。精細的XPath表達式還有很多,請參見http://www.w3c.org/TR/xpath的規(guī)范,或者在http://www.zvon.org/xxl/XPathTutorial/General/examples.html上的一個非常好的在線指南。

Java SE 5.0增加了一個API來計算XPath表達式,首先需要從XPathFactory創(chuàng)建一個XPath對象:

然后,調(diào)用evaluate方法來計算XPath表達式:

你可以用同一個XPath對象來計算多個表達式。

這種形式的evaluate方法將返回一個字符串。這很適合用來獲取文本,比如前面的例子中的username節(jié)點中的文本。如果XPath表達式產(chǎn)生了一組節(jié)點,請做如下調(diào)用:

如果結(jié)果只有一個節(jié)點,則以XPathConstants.NODE代替:

如果結(jié)果是一個數(shù)字,則使用XPathConstants.NUMBER:

不必從文檔的根節(jié)點開始搜索,可以從任意一個節(jié)點或節(jié)點列表開始。例如,如果你有前一次計算得到的節(jié)點,那么就可以調(diào)用:

圖3-5 計算XPath表達式

程序清單3-7中的程序演示了XPath表達式的求值操作。只要載入一個XML文件,鍵入一個表達式,選擇表達式的類型,點擊計算按鈕,表達式的結(jié)果就會在框架底部顯示出來了(見圖3-5)。

程序清單3-7 xpath/XPathTester.java

javax.xml.xpath.XPathFactory 5.0

·static XPathFactory newInstance()

返回用于創(chuàng)建XPath對象的XPathFactory實例。

·XPath newXpath()

構(gòu)建用于計算XPath表達式的XPath對象。

javax.xml.xpath.XPath 5.0

·String evaluate(String expression,Object startingPoint)

從給定的起點計算表達式。起點可以是一個節(jié)點或節(jié)點列表。如果結(jié)果是一個節(jié)點或節(jié)點集,則返回的字符串由所有文本節(jié)點子元素的數(shù)據(jù)構(gòu)成。

·Object evaluate(String expression,Object startingPoint,QName resultType)

從給定的起點計算表達式。起點可以是一個節(jié)點或節(jié)點列表。resultType是XPathConstants類的常量STRING、NODE、NODESET、NUMBER或BOOLEAN之一。返回值是String、Node、NodeList、Number或Boolean。

主站蜘蛛池模板: 井研县| 独山县| 汉寿县| 山西省| 高阳县| 土默特左旗| 海淀区| 临湘市| 临高县| 赤水市| 萨嘎县| 台中市| 遂宁市| 秭归县| 双峰县| 汨罗市| 林口县| 尼勒克县| 固原市| 台湾省| 兴文县| 余江县| 江阴市| 明星| 车险| 赤壁市| 明水县| 瓦房店市| 永宁县| 远安县| 卓资县| 洱源县| 明溪县| 咸阳市| 海阳市| 油尖旺区| 津市市| 文山县| 双鸭山市| 兰坪| 卫辉市|