2011-01-14 62 views
16

所以我有我在這裏宣佈一個XML文檔:查找節點元素不正確的命名空間,在Java

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 

然後,我有,我傳遞一個字符串的函數,我想匹配的元素在我的xml:

void foo(String str) 
{ 
    NodeList nodelist = doc_.getDocumentElement().getElementsByTagName(str); 
} 

的問題是當str進來它沒有任何類型的命名空間在裏面,這樣我就可以測試XML是:

<Random> 
    <tns:node /> 
</Random> 

str將是節點。所以nodelist現在是空的,因爲它期望tns:node,但是我通過節點。我知道它不好忽略命名空間,但在這種情況下它很好。我的問題是,我不知道如何在忽略名稱空間的同時搜索Node的元素。我也想過把命名空間添加到進來的str中,但我不知道該怎麼做。

任何幫助將不勝感激,

感謝,-Josh

回答

26

爲了匹配所有節點無論命名空間如何,其名稱是'str'都使用以下內容:

NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS("*", str); 

通配符「*」將匹配任何名稱空間。見Element.getElementsByTagNameNS(...)

編輯:此外,如何在@Wheezil評論正確地指出,你必須調用DocumentBuilderFactory.setNamespaceAware(true)這個工作,否則命名空間不會被檢測到。

2

最簡單的辦法就是通過字符串操作,添加自己的根節點

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
s = "<root xmlns:tns=\"MyNamespace\">" + s + "</root>"; 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 
+0

該字符串已經有一個名稱空間,我需要添加到該方法的字符串需要識別該名稱空間。 – Grammin 2011-01-14 15:34:42

+0

您可以發佈您正在嘗試處理的完整xml的最小示例。您發佈的xml示例使用的是不在任何地方聲明的名稱空間。命名空間tns需要映射到XML文檔的URL以形成格式(請參閱http://en.wikipedia.org/wiki/XML_namespace#Namespace_declaration)。 – 2011-01-14 15:44:46