Mar*_*nik 3 java dom default namespaces
我想使用 DOM 创建一个带有默认命名空间的 XML:
<?xml version="1.0" encoding="US-ASCII"?>
<test xmlns="example:ns:uri" attr1="XXX" attr2="YYY">
<el>bla bla</el>
</test>
Run Code Online (Sandbox Code Playgroud)
我有以下
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");
Run Code Online (Sandbox Code Playgroud)
我得到
<?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>
Run Code Online (Sandbox Code Playgroud)
我在 JDK v6 中使用标准 DOM API。我究竟做错了什么 ?我想强调 - 我想使用默认命名空间,我不想使用命名空间前缀。
我想使用默认命名空间,我不想使用命名空间前缀
默认命名空间声明 ( 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>
Run Code Online (Sandbox Code Playgroud)
您需要将元素放在命名空间中
Element rootElement =
resultingDOMDocument.createElementNS("example:ns:uri", "test-results-upload");
Run Code Online (Sandbox Code Playgroud)
但属性不是:
rootElement.setAttributeNS(null, "attr1", "XXX");
rootElement.setAttributeNS(null, "attr2", "YYY");
Run Code Online (Sandbox Code Playgroud)