2013-01-11 22 views
0

這感覺就像是一個noob問題。getNodeName與XML節點匹配,但XPath無法找到它

我在看一堆操縱XML DOM的Java代碼。 (這些類股票org.w3c.dom.Documentjavax.xml.xpath.XPath與JDK 7,使得船)它有一噸的看起來像這樣的地方:

String expr = "/fixed/path/through/the/hierarchy"; 

// actual code reuses factory instances, etc 
XPath xpath = XPathFactory.newInstance().newXPath(); 
Node topNode = someDocumentInstance.getFirstChild(); 
Node node = (Node) xpath.evaluate (expr, topNode, XPathConstants.NODE); 

NodeList children = node.getChildNodes(); 
for (int i = 0; i < children.getLength(); i++) { 
    Node child = children.item(i); 
    if (child.getNodeName().equalsIgnoreCase("somePrefix:someTag")) { 
     // "return child;" or otherwise break out of the loop 
    } 
} 

而且它所有的作品。但是這個循環看起來很乏味。如果我們已經在使用XPath來獲取節點,那麼爲什麼然後迭代該節點的孩子尋找一個已知標籤?

所以我試圖重寫一個節來直接獲取子節點。但是使用查詢

String expr = "/fixed/path/through/the/hierarchy/somePrefix:someTag"; 

永遠不會匹配任何東西。我嘗試過要求XPathConstants.NODESET.STRING,但仍然沒有結果。 (應該只有這些節點之一無論如何。)

我覺得我在這裏錯過了一些極其明顯的東西,但我無法弄清楚爲什麼完整的查詢失敗,當查詢爲父加通過兒童作品的手動循環。當我使用類似這樣的查詢時,XPath是否會測試一個超出getNodeName()的節點的質量?

的唯一理論,我想出的是,它是與XML命名空間,這是不是在這個項目中使用。 (實際上,有上有評論稱的DocumentBuilderFactory實例.setNamespaceAware(false)一個叫「離開這個關閉或事事處處打破」。)

回答

1

如果你沒有命名空間解析,那麼你就應該離開somePrefix你的表情:

String expr = "/fixed/path/through/the/hierarchy/someTag"; 

這樣做的原因是,XPath的執行對命名空間和本地名稱合格的名稱相匹配,(這是什麼getNodeName()回報)。如果您在XPath表達式中添加前綴,那麼XPath解釋器將使用它來從名稱空間映射中檢索名稱空間。既然你沒有給它任何映射,那就會失敗。

此外,你可能想使用NODESET如果你要遍歷子節點。

+0

啊哈!沒有意識到XPath的問題,謝謝澄清! –