Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中查找没有正确名称空间的节点中的元素_Java_Xml_Dom_Xml Namespaces_Nodelist - Fatal编程技术网

在Java中查找没有正确名称空间的节点中的元素

在Java中查找没有正确名称空间的节点中的元素,java,xml,dom,xml-namespaces,nodelist,Java,Xml,Dom,Xml Namespaces,Nodelist,我在这里声明了一个xml文档: DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); StringReader reader = new StringReader(s); InputSource inputSource = new InputSource(reader); doc_ = dBuilder.parse(inputSource); 然后我有一个传递字符串的函数,我想将它与xml中的一个元素匹配: void foo(S

我在这里声明了一个xml文档:

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现在为null,因为它需要tns:node,但我传入了node。我知道忽略名称空间是不好的,但是在这个例子中,忽略名称空间很好。我的问题是,我不知道如何在忽略名称空间的同时搜索节点中的元素。我还考虑过将名称空间添加到进来的str中,但我也不知道如何做到这一点

任何帮助都将不胜感激


谢谢,-Josh

为了匹配名称为“str”的所有节点(无论名称空间如何),请使用以下命令:

NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS("*", str);
通配符“*”将匹配任何命名空间。看


编辑:此外,@Wheezil如何在评论中正确陈述,您必须调用
DocumentBuilderFactory.setNamespaceAware(true)
才能工作,否则将无法检测到名称空间。

非常感谢您提供另一个很棒的答案RD01。这似乎只适用于“名称空间感知”
DocumentBuilderFactory
对象,因为DOM级别1创建的元素没有
localName
…此外,如果您的文档中的项根本没有命名空间,它仍然找不到它们…:(是否有人注意到,如果要指定命名空间的URL而不是“*”,则根本不会返回任何元素。例如,当我尝试匹配Soap Envelope时……请注意,必须调用DocumentBuilderFactory.setNamespaceAware(true)才能使其工作。