2013-01-15 42 views
4

默認命名空間我有以下XML包含默認命名空間應用的XPath在XML與XOM

<?xml version="1.0"?> 
<catalog xmlns="http://www.edankert.com/examples/"> 
    <cd> 
    <artist>Stoat</artist> 
    <title>Future come and get me</title> 
    </cd> 
    <cd> 
    <artist>Sufjan Stevens</artist> 
    <title>Illinois</title> 
    </cd> 
    <cd> 
    <artist>The White Stripes</artist> 
    <title>Get behind me satan</title> 
    </cd> 
</catalog> 

和進出口運行下面的代碼返回

Element rootElem = new Builder().build(xml).getRootElement(); 
xc = XPathContext.makeNamespaceContext(rootElem); 
xc.addNamespace("", "http://www.edankert.com/examples/"); 
Nodes matchedNodes = rootElem.query("cd/artist", xc); 
System.out.println(matchedNodes.size()); 

期待了一些成績,但大小始終是0

我通過

期待任何幫助。

+0

得到這真的很有幫助 - http://stackoverflow.com/a/3439776/1160106。嘗試更新的答案部分。 – Samiron

回答

4

XPath中未定義的名稱始終表示「無名稱空間」 - 它們不尊重默認名稱空間聲明。您需要使用前綴

Element rootElem = new Builder().build(xml).getRootElement(); 
xc = XPathContext.makeNamespaceContext(rootElem); 
xc.addNamespace("ex", "http://www.edankert.com/examples/"); 
Nodes matchedNodes = rootElem.query("ex:cd/ex:artist", xc); 
System.out.println(matchedNodes.size()); 

不要緊的XPath表達式使用前綴在原始文檔沒有,只要空間URI綁定到前綴中的XPath名稱空間上下文與文檔中由xmlns綁定的URI相同。

+0

只是另一個提示,你必須添加你的xpath表達式中使用的所有標記的所有命名空間,不僅僅是合格的。在我的情況下,問題是它缺少我的非限定名稱空間的addNamespace :( –