考虑以下 XML
<TestFile>
<TestHeader>
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
</TestFile>
过去我曾使用Java DOM解析来设置像这样的默认命名空间
MyDoc.getDocumentElement().setAttribute("xmlns", this.NameSpaceAsString);
在 Java 8 的早期版本中,这会生成像这样的正确 XML
<TestFile xmlns="mynamespace.com">
<TestHeader>
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
但是,升级到 Java 11 后,我现在在前 2 个节点上获得 2 个默认命名空间,其中一个像这样是空的
<TestFile xmlns="mynamespace.com">
<TestHeader xmlns=" ">
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
我不确定发生了什么变化会导致 getDocumentElement 找到 2 个节点或 setAttribute 在 2 个位置设置。
给出这段代码:
public static void main(String[] args) throws Exception {
System.out.println("JVM version: " + System.getProperty("java.version"));
Document d = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new File("data.xml"));
d.getDocumentElement().setAttribute("xmlns", "xyzzy");
TransformerFactory
.newInstance()
.newTransformer()
.transform(new DOMSource(d), new StreamResult(System.out));
}
四个不同java版本的输出是:
JVM version: 1.7.0_352
<?xml version="1.0" encoding="UTF-8" standalone="no"?><TestFile xmlns="xyzzy">
<TestHeader>
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
</TestFile
JVM version: 1.8.0_282b08-internal
<?xml version="1.0" encoding="UTF-8" standalone="no"?><TestFile xmlns="xyzzy">
<TestHeader>
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
</TestFile>
JVM version: 11.0.25
<?xml version="1.0" encoding="UTF-8" standalone="no"?><TestFile xmlns="xyzzy">
<TestHeader>
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
</TestFile>
JVM version: 23.0.1
<?xml version="1.0" encoding="UTF-8" standalone="no"?><TestFile xmlns="xyzzy">
<TestHeader>
<FileVersion>2.00</FileVersion>
<FileCountry>GB</FileCountry>
<FileRegion>LND</FileRegion>
</TestHeader>
</TestFile>
请注意,使用不知道命名空间的 XML 处理器来管理命名空间始终是个坏主意。