2

我正在使用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();
4

3 回答 3

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>
于 2010-07-08T06:49:40.623 回答
2

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

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

Catchwa 的实现工作得很好。只有我告诉它有命名空间的元素才有命名空间。所有空的 xmlns 属性都消失了。真奇怪。

它是一个错误吗?我似乎无法弄清楚那部分。还是只是 XOM 的工作方式?

于 2011-07-27T17:31:36.420 回答
1

不要混淆命名空间和命名空间声明。命名空间是每个元素的固有属性。命名空间声明是“xmlns”属性。它们不是同一个东西,尽管它们是相互联系的。当你创建一个元素时,你设置了它的命名空间,而不是它的命名空间声明。

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

在 XOM 中,您在指定本地名称的同时指定元素或属性的名称空间。当您创建一个元素时,该元素最初没有父元素,因此 XOM 无法默认为该元素提供与其父元素相同的命名空间,即使这是想要的(而事实并非如此)。

When the document is serialized the namespaces are represented by xmlns and xmlns:*prefix* attributes. XOM figures out where to put these elements to match the namespaces you've assigned to each element. Just specify the namespace you want for each element in your code, and let XOM figure out where to put the namespace declarations.

于 2016-03-25T13:41:01.970 回答