查找节点元素不正确的命名空间,在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);
该字符串已经有一个名称空间,我需要添加到该方法的字符串需要识别该名称空间。 – Grammin 2011-01-14 15:34:42
您可以发布您正在尝试处理的完整xml的最小示例。您发布的xml示例使用的是不在任何地方声明的名称空间。命名空间tns需要映射到XML文档的URL以形成格式(请参阅http://en.wikipedia.org/wiki/XML_namespace#Namespace_declaration)。 – 2011-01-14 15:44:46