2013-06-26 150 views
1

我使用爪哇元素標籤的序列(爪哇/撒克遜)與撒克遜HE 9.4所以我可以有的XPath 2.0支持。的XPath越來越

給出下面的XML實例文檔:

<entities> 
    <entity> 
     <person> 
      James 
     </person> 
    </entity> 
    <entity> 
     <legalEntity> 
      ACME 
     </legalEntity> 
    </entity> 
</entities> 

我知道我可以做一個拿到實體元素標籤的列表:

XPathExpression expr = xpath.compile("/entities/entity/*"); 
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
for (int i = 0 ; i < nodes.getLength() ; i++) 
    System.out.println("element name = "+ nodes.item(i).getNodeName()); 

上面會輸出:

element name = person 
element name = legalEntity 

預期...。 XPath表達式本身,呼叫到getNodeName方法:

然而,邏輯在兩個地方傳播。我想要的是一個XPath表達式,它將返回一個通用的結果列表,我可以通過調用一些通用方法(而不是getNodeName)來進行迭代。

這樣一來,所有的邏輯可以駐留在XPath表達式本身和我的代碼可能只是保持的XPath字符串的文件並在運行時處理它們得到的結果的列表。

試圖XPath表達式/entities/entity/*/name()僅取第一個值(人):

XPathExpression expr = xpath.compile("/entities/entity/*/name()"); 
System.out.println("element name = "+expr.evaluate(doc)); 

...並在運行時代碼休息,如果我嘗試強制轉換到NodeList

XPathExpression expr = xpath.compile("/entities/entity/*/name()"); 
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
for (int i = 0 ; i < nodes.getLength() ; i++) { 
    ... 

(以上失敗:net.sf.saxon.trans.XPathException: Cannot convert XPath value to Java object: required class is org.w3c.dom.NodeList; supplied value has type xs:string

那麼有沒有一種通用的方式來獲得XPath表達式求列出的結果(這可能是元素標籤,元素值,屬性值和標籤等),以便遍歷這些結果的代碼是在所有情況下相同,不必調用之間分化爲getNodeName()getNodeValue()

回答

2

您正在使用JAXP接口的XPath。這是專爲XPath 1.0而設計的,只能識別XPath 1.0數據類型(字符串,節點集等)。您希望執行一個返回字符串列表(或者QNames)的查詢,因此您需要使用支持這種數據類型的API--具體而言,您需要轉移到Saxon的s9api API。

在s9api接口中,XPathSelector對象(請參閱http://www.saxonica.com/documentation/#!javadoc/net.sf.saxon.s9api/XPathSelector)實現Java的Iterable接口,因此您可以直接在Java「for-each」指令中使用它來將結果作爲一系列XdmItem對象處理; XdmItems可以是節點或原子值,實際上是XPath 2.0數據模型中定義的任何類型。

您可以使用s9api針對Saxon的本機樹模型(使用s9api DocumentBuilder構建)或針對DOM,JDOM,XOM等外部模型運行XPath表達式。使用Saxon的本機模型比任何外部模型楷模。

+0

據:http://www.saxonica.com/feature-matrix.html的s9api也可用於自由撒克遜HE這就是我使用的,但我似乎無法找到任何「官方」 ,使用該API的最新源代碼示例用於最新的Saxon版本(9。5) –

+2

您可以在saxon-resources下載中找到示例程序:請參閱http://sourceforge.net/projects/saxon/files/Saxon-HE/9.5/saxon-resources9-5.zip/download –