如何仅使用XOM在第一个标签上设置命名空间?

时间:2010-07-08 06:34:55

标签: java xml xml-namespaces xom

我正在使用XOM在Java中构建XML文档。

我创建了一个简单的XML文档,我想要一个XML命名空间。但是当我在第一个标签上设置命名空间时,在像xmlns=""这样的子节点上设置了一个空命名空间,我该如何摆脱这种行为呢?我只想在第一个标签上添加xmlns

我想要这个XML:

<request xmlns="http://my-namespace">
    <type>Test</type>
    <data>
        <myData>test data</myData>
    </data>
</request>

但这是从XOM输出的XML文档

<request xmlns="http://my-namespace">
    <type xmlns="">Test</type>
    <data xmlns="">
        <myData>test data</myData>
    </data>
</request>

这是我的Java XOM代码:

String namespace = "http://my-namespace";
Element request = new Element("request", namespace);

Element type = new Element("type");
type.appendChild("Test");

request.appendChild(type);

Element data = new Element("data");
request.appendChild(data);

Element myData = new Element("myData");
myData.appendChild("test data");
data.appendChild(myData);

Document doc = new Document(request);
doc.toXML();

3 个答案:

答案 0 :(得分:8)

这对我有用。但是,我有点疑惑为什么Element对象不会继承父级的命名空间。 (不是XML也不是XOM专家)

代码:

String namespace = "http://my-namespace";
Element request = new Element("request", namespace);

Element type = new Element("type", namespace);
type.appendChild("Test");

request.appendChild(type);

Element data = new Element("data", namespace);
request.appendChild(data);

Element myData = new Element("myData", namespace);
myData.appendChild("test data");
data.appendChild(myData);

Document doc = new Document(request);
System.out.println(doc.toXML());

输出:

<?xml version="1.0"?>
<request xmlns="http://my-namespace">
  <type>Test</type>
  <data>
    <myData>test data</myData>
  </data>
</request>

答案 1 :(得分:2)

我遇到了同样的问题,谷歌把我带到了这里。

@Michael - 这就是它在javadoc中所说的,是的,但不幸的是,当你实现它时,它不是它的工作原理。除非您执行Catchwa的实现,否则子元素将继续获取空白的xmlns属性。

Catchwa的实施工作正常。只有我告诉它有一个命名空间的元素才有一个命名空间。所有空的xmlns属性都消失了。这很奇怪。

这是一个错误吗?我似乎无法想出这一部分。或者它只是XOM的工作方式?

答案 2 :(得分:1)

不要混淆名称空间和名称空间声明。命名空间是每个元素的固有属性。名称空间声明是`xmlns&#39;属性。它们不是一回事,尽管它们是相互联系的。创建元素时,可以设置其名称空间,而不是其名称空间声明。

在XOM数据模型中,名称空间不是属性。它们是元素本身的固有属性。 XML中没有规则要求元素的子元素与父元素位于同一个命名空间中。实际上,理论上文档中的每个元素都可以位于不同的命名空间中。

在XOM中,您可以在指定本地名称的同时指定元素或属性的命名空间。当你创建一个元素时,该元素最初没有父元素,因此XOM无法默认为元素提供与其父元素相同的命名空间,即使它是想要的(并且它是&#39) ;不是)。

文档序列化后,名称空间由xmlnsxmlns:*prefix*属性表示。 XOM指出将这些元素放在哪里以匹配您为每个元素分配的命名空间。只需为代码中的每个元素指定所需的命名空间,然后让XOM找出命名空间声明的位置。