4

我正在尝试构建以下 XML 结构:

<EDIOrderPackage xmlns="urn:URI" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Version>1.0.0.0</Version>
    <Test>true</Test>
</EDIOrderPackage>

我使用 JDOM2,但不知道如何添加 2 个命名空间!即使我只设置了一个命名空间,结果也与我希望的不一样。如果我设置命名空间root.setNamespace()并使用带有前缀 i 的第二个命名空间,它看起来像这样:

<i:EDIOrderPackage mlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Version>1.0.0.0</Version>
    <Test>true</Test>
<i:/EDIOrderPackage>

所以在 EDIOrderPackage 之前有一个 i。

如果我不使用前缀,则如下所示:

<EDIOrderPackage xmlns="urn:URI">
    <Version xmlns="">1.0.0.0</Version>
    <Test xmlns="">true</Test>
</EDIOrderPackage>

如果尝试将其添加为属性,则会引发错误消息,即我不能使用名称为“xmlns”的属性

那么如何使用 JDOM 构建一个类似于上面的 XML 呢?

4

1 回答 1

4

诀窍在于,对于命名空间,您必须为添加的所有元素正确指定它。

此外,默认命名空间是声明为xmlns="...."而不是xmlns:abc="...."

当您使用默认命名空间时,它在元素上没有“前缀”。因此,从您的示例代码中,您有:

  • 默认命名空间:xmlns="urn:URI"
  • 'i' 命名空间: xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

您可以使用 JDOM 创建这些:

Namespace nsDefault = Namespace.getNamespace("urn:URI");
Namespace nsI = Namespace.getNamespace("i", "http://www.w3.org/2001/XMLSchema-instance");

现在,当您创建元素时,您必须将它们放在正确的命名空间中:

Element root = new Element("EDIOrderPackage", nsDefault);
Element version = new Element("Version", nsDefault);
Element test = new Element("Test", nsDefault);

root.addNamespaceDeclaration(nsI); // add the i namespace declaration.
root.addContent(version);
root.addContent(test);

如果您添加事物的 XMLOutputter 方面:

Document doc = new Document(root);
XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
xout.output(doc, System.out);

上面的代码产生输出

<?xml version="1.0" encoding="UTF-8"?>
<EDIOrderPackage xmlns="urn:URI" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Version />
  <Test />
</EDIOrderPackage>
于 2014-10-01T13:23:19.100 回答