JDOM2 - 两个命名空间

时间:2014-10-01 13:14:52

标签: java xml namespaces jdom-2

我正在尝试构建以下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>

所以在EDIPOrderPackage之前有一个i。

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

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

如果尝试将其添加为属性,则会抛出错误消息,即我不能使用名称&#34; xmlns&#34;

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

1 个答案:

答案 0 :(得分:4)

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

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

的名称空间

当您使用默认命名空间时,它没有&#39;前缀&#39;在元素上。所以从您的示例代码中可以看出:

  • 默认命名空间:xmlns="urn:URI"
  • &#39; i&#39;命名空间: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>