2014-01-21 54 views
1

我有使用支持名稱空間的XPath搜索XML文檔(org.w3c.dom)的代碼。我在向文檔中添加元素然後能夠通過XPath找到它們時遇到了問題。將元素添加到文檔並使用XPath查找

如果我添加元素並使用XPath搜索,我沒有得到任何結果。但是,如果將文檔轉換爲字符串並重新分析爲文檔,那麼XPath將查找該元素。

我創建的XPath如下:

String myXPathQuery = "/ns1:element1/ns2:element2/ns3:element3"; 
XPathFactory fact = XPathFactory.newInstance(); 
XPath xpath = fact.newXPath(); 
xpath.setNamespaceContext(myNSContext); 
XPathExpression myXPathExpression = xpath.compile(myXPathQuery); 

我加入元素如下:

Document doc = ...; 
Element elementToWhichToAdd = ...; // this is "ns2:element2" 

Element newElement = doc.createElement("ns3:element3"); 
elementToWhichToAdd.appendChild(newElement); 

如果我運行鍼對該文件沒有找到任何上述的XPath。但是,如果我重新解析XPath的工作文檔。

我錯過了什麼?

EDIT

正如我更新我添加命名空間的文件,如果它不存在,(它通常沒有)的過程的一部分。

Element rootElement = doc.getDocumentElement(); 
NamedNodeMap map = rootElement.getAttributes(); 
if (map.getNamedItem("xmlns:ns3") == null) 
    rootElement.setAttributeNS("http://www.w3.org/2000/xmlns", "xmlns:ns3", 
      "urn:exo:/path/to/xsd/in/jar"); 

回答

1
Element newElement = doc.createElement("ns3:element3"); 

createElement是DOM 1級方法是不具有感知名稱空間 - its JavaDoc說,它返回

ElementnodeName屬性設置爲tagName對象,localNameprefixnamespaceURI設置爲null

你需要使用DOM 2級createElementNS創建新的元素,而不是

Element newElement = doc.createElementNS("urn:exo:/path/to/xsd/in/jar", "ns3:element3"); 

(或者是正確的命名空間URI對應於ns3,你可以直接從名稱空間上下文得到它使用myNSContext.getNamespaceURI("ns3"))。

+0

我已經嘗試過幾種不同的上述方法,但沒有運氣。 '(「urn:ns3」,「ns3:element3」)','(「xmlns:ns3」,「ns3:element3」)'。請參閱關於添加NS的帖子編輯。當我做了上述任何一個元素的形式是'ns3:element xmlns:ns3 =「urn:ns3」... />' –

+0

@JohnB從你編輯的代碼中我會認爲'createElementNS (「urn:exo:/ path/to/xsd/in/jar」,「ns3:element3」)'就是你要找的東西。 –

+0

我的朋友,你搖滾!謝謝! –