关于Java从11升级到17的问题及其对使用Java DOM文档解析XML的影响

问题描述 投票:0回答:1

考虑以下 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 个位置设置。

java dom xml-parsing
1个回答
0
投票

给出这段代码:

    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 处理器来管理命名空间始终是个坏主意。

© www.soinside.com 2019 - 2024. All rights reserved.