我正在使用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();
答案 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) ;不是)。
文档序列化后,名称空间由xmlns
和xmlns:*prefix*
属性表示。 XOM指出将这些元素放在哪里以匹配您为每个元素分配的命名空间。只需为代码中的每个元素指定所需的命名空间,然后让XOM找出命名空间声明的位置。