查找节点元素不正确的命名空间,在Java

问题描述:

所以我有我在这里宣布一个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

为了匹配所有节点无论命名空间如何,其名称是'str'都使用以下内容:

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

通配符“*”将匹配任何名称空间。见Element.getElementsByTagNameNS(...)

编辑:此外,如何在@Wheezil评论正确地指出,你必须调用DocumentBuilderFactory.setNamespaceAware(true)这个工作,否则命名空间不会被检测到。

最简单的办法就是通过字符串操作,添加自己的根节点

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