Java DOM默认命名空间

时间:2013-08-20 15:00:40

标签: java dom namespaces default

我想使用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 个答案:

答案 0 :(得分:4)

  

我想使用默认命名空间,我不想使用命名空间前缀

默认命名空间声明(xmlns="...")仅适用于元素,而不适用于属性。因此,如果在命名空间中创建属性,则序列化程序必须将该命名空间URI绑定到前缀并使用该前缀作为属性,以便准确地序列化DOM树,即使相同的URI也是绑定到默认xmlns。未加前缀的属性名称始终表示 no 名称空间,因此为了生成

<?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");