【问题标题】:Find elements in a Node without the proper namespace, in Java在 Java 中查找没有正确命名空间的节点中的元素
【发布时间】:2011-06-09 05:18:13
【问题描述】:

所以我在这里声明了一个 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 现在为空,因为它期望 tns:node 但我传入了 node。而且我知道忽略名称空间不好,但在这种情况下它很好。我的问题是我不知道如何在忽略命名空间的同时搜索节点中的元素。我也想过将命名空间添加到进来的 str 中,但我也不知道该怎么做。

任何帮助将不胜感激,

谢谢,-乔什

【问题讨论】:

    标签: java xml dom xml-namespaces nodelist


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢您提供另一个很棒的答案 RD01。
    • 这似乎只适用于“命名空间感知”DocumentBuilderFactory 对象,因为 DOM 级别 1 创建的元素没有 localName...
    • 另外,如果您的文档中的项目根本没有命名空间,它仍然找不到它们... :(
    • 是否有人注意到,如果你想指定命名空间的 URL 而不是“*”,则根本不会返回任何元素。例如,当我尝试匹配 Soap Enveloppe...
    • 请注意,您必须调用 DocumentBuilderFactory.setNamespaceAware(true) 才能使其工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多