【问题标题】:Why are xmlns="" added to element in Java automatically?为什么 xmlns="" 会自动添加到 Java 中的元素?
【发布时间】:2021-01-21 10:13:25
【问题描述】:

我正在使用 Java 创建一个 XML 文件。 我使用 createElemenNS() 创建了根节点来创建具有命名空间的根节点。

Element root = doc.createElementNS("http://www.myorc.com/schemas", "InvConf");

然后我使用 createElement() 创建了一个节点并将其添加到根节点。该节点会自动添加如下命名空间。

 Element invList = doc.createElement("InvList");
 root.appendChild(invList);

<InvConf xmlns="http://www.myorc.com/schemas">
   <InvList xmlns="">
   ...
   </InvList>
   <InvList xmlns="">
   ...
   </InvList>
   <InvList xmlns="">
   ...
   </InvList>
</InvConf>

如何避免将命名空间添加到子节点? 我希望最终的 XML 如下所示

<InvConf xmlns="http://www.myorc.com/schemas">
   <InvList>
   ...
   </InvList>
   <InvList>
   ...
   </InvList>
   <InvList>
   ...
   </InvList>
</InvConf>

发现只有当 xmlparserv2.jar 在 CLASSPATH 中时才会出现问题。这是应用程序的某些部分所要求的。如何解决?

【问题讨论】:

  • 子节点如果与父节点在同一个命名空间,则不会列出命名空间。
  • xmlns="" 不添加命名空间,它删除了一个。它被放在那里是因为您创建的元素与其父元素不在同一个命名空间中。

标签: java xml namespaces


【解决方案1】:

添加 xmlns="" 是因为您的孩子不在命名空间中,而您的父母在。要更改它,请在创建元素时将其放在命名空间中。 改变

createElement("InvList");

到正确的命名空间。

【讨论】:

    【解决方案2】:

    正如 cmets xmlns="" 中指出的那样,意味着该元素没有任何命名空间。例如。从 XML 解析器的角度来看,以下两个文档是相同的:

    <ns:root xmlns:ns="http://namespace.com">
        <child/>
    </ns:root>
    

    <root xmlns="http://namespace.com">
        <child xmlns=""/>
    </root>
    

    为避免在不属于任何命名空间的元素中创建xmlns="",您可以在上层元素上创建前缀:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
        
    Document doc = db.newDocument();
    Element root = doc.createElementNS("http://namespace.com", "root");
    root.setPrefix("ns");
    Element child = doc.createElementNS("", "child");
    root.appendChild(child);
    doc.appendChild(root);
    

    此代码将创建以下 XML:

    <ns:root xmlns:ns="http://namespace.com">
        <child/>
    </ns:root>
    

    或者,您可以使用以下语法来获得相同的结果:

    Document doc = db.newDocument();
    Element root = doc.createElementNS("http://namespace.com", "ns:root");
    Element child = doc.createElementNS("", "child");
    root.appendChild(child);
    doc.appendChild(root);
    

    当注释掉root.setPrefix("ns"); 行或创建不带前缀(doc.createElementNS("http://namespace.com", "root");) 的元素时,将生成以下XML:

    <root xmlns="http://namespace.com">
        <child xmlns=""/>
    </root>
    

    【讨论】:

    • 子元素不应该继承父元素的命名空间吗?为什么我们需要明确提及它?
    • 就是这样。您为父级声明默认命名空间(没有前缀的命名空间),默认情况下所有子级都应属于同一个命名空间。如果它们不属于,则生成xmlns="" 以表明它们不属于父命名空间。
    • 好的。如何避免将 xmlns="" 添加到子元素。最终的 XML 不应该在子元素上有这个。
    • 这取决于。如果子元素应与父元素位于同一命名空间中,请使用 createElementNS() ans parents 命名空间以相同的方式创建它们。如果他们不应该有命名空间,请在父级别定义命名空间前缀,如答案中所述。
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多