Java DOM默认命名空间

3
我想使用DOM创建一个具有默认命名空间的XML:
   <?xml version="1.0" encoding="US-ASCII"?>
<test xmlns="example:ns:uri" attr1="XXX" attr2="YYY">
  <el>bla bla</el>
</test>

我有以下内容:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
resultingDOMDocument = db.newDocument();
Element rootElement =
   resultingDOMDocument.createElementNS("example:ns:uri", "test-results-upload");
rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "example:ns:uri");
rootElement.setAttributeNS("example:ns:uri", "attr1", "XXX");
rootElement.setAttributeNS("example:ns:uri", "attr2", "YYY");

我明白了

,并且我收到了。
<?xml version="1.0" encoding="US-ASCII"?>
<test xmlns="example:ns:uri" ns0:attr1="XXX" xmlns:ns0="example:ns:uri" ns1:attr2="YYY" xmlns:ns1="example:ns:uri">
  <el>bla bla</el>
</test>

我正在使用JDK v6中的标准DOM API。我错在哪里? 我想要加下划线 - 我想要使用默认命名空间,而且我不想使用命名空间前缀。
1个回答

5
我想使用默认命名空间,且不想使用命名空间前缀。
默认命名空间声明 (xmlns="...") 仅适用于元素,而不适用于属性。因此,如果您在命名空间中创建属性,则序列化程序必须将该命名空间 URI 绑定到前缀,并使用该前缀来对属性进行序列化,以便准确地序列化 DOM 树,即使相同的 URI 也绑定到默认 xmlns 命名空间上。未带前缀的属性名称始终表示命名空间,因此为了生成...
<?xml version="1.0" encoding="US-ASCII"?>
<test xmlns="example:ns:uri" attr1="XXX" attr2="YYY">
  <el>bla bla</el>
</test>

您需要将元素放置在命名空间中。

Element rootElement =
   resultingDOMDocument.createElementNS("example:ns:uri", "test-results-upload");

但是这些属性并非:

rootElement.setAttributeNS(null, "attr1", "XXX");
rootElement.setAttributeNS(null, "attr2", "YYY");

1
谢谢IAN - 你的回答非常有用 - 我必须承认我不知道那个重要的事实。这是XML规范的链接[http://www.w3.org/TR/REC-xml-names/#defaulting]和另一个答案[https://dev59.com/bXVD5IYBdhLWcg3wQJKT] - Marcin Cinik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接