java标准库产生错误的xml 1.1

标签 java xml document transformer-model xml-1.1

我上周发现了这个有趣的问题。运行下面的程序。非常简单,首先创建一个虚拟 xml 文件,然后用标准库读取它并将其写回文件。

查看生成的gtest2.xml,你会发现其中有些内容是凭空冒出来的。

在我的例子中,这是错误部分的示例(不同机器上的位置不同)。

<test>1924</test>
<test>1925</test>
<test>t&gt;24</test>
<test>1927</test>
<test>1928</test>
<test>1929</test>

如果我将 xml 版本更改为 1.0,则不会发生这种情况。那么我的代码或 jdk 有问题吗?

测试代码如下:

import java.io.File;
import java.io.PrintWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

public class DocumentBuilderCheck {

    public static void main(String[] args) throws Exception {
        String filename = "/tmp/gtest.xml";
        generateXmlFile(filename, 2500);
        Document doc = readXmlFile(filename);

        String filename2 = "/tmp/gtest2.xml";
        writeDocument(doc, filename2);
    }

    private static void writeDocument(Document document, String filename) throws Exception {
        StreamResult streamResult = new StreamResult(filename);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.transform(new DOMSource(document), streamResult);
    }

    private static Document readXmlFile(String filename) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        return doc;
    }

    private static void generateXmlFile(String filename, int total)
            throws Exception {
        File f = new File(filename);

        PrintWriter pw = new PrintWriter(f);
        pw.write("<?xml version=\"1.1\" encoding=\"UTF-8\"?>");
        pw.write("<main_tag>");
        for (int i = 0; i < total; i++) {
            pw.write("<test>" + String.format("%04d", i) + "</test>");
        }
        pw.write("</main_tag>");
        pw.close();
    }
}

最佳答案

我不知道是什么原因,但 JDK 的一个众所周知(?)的问题是它通常包含旧版本的库,例如 Xerces(XML 解析器)和 Xalan(XSLT 处理器)。更糟糕的是,有时这些是使用旧版本作为基准的自定义版本,以及一些补丁集,因此甚至很难验证会发生什么。

因此,建议不要依赖捆绑的任何内容,而是明确使用官方 Xerces/Xalas 版本以确保使用的版本是已知的,并且您至少可以检查存在哪些已知问题。

因此,也许您可​​以使用最新的 Xerces 和 Xalan 版本来确保它不是之前已修复的问题。

关于java标准库产生错误的xml 1.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988114/

相关文章:

java - 我可以在 Java 8 中将 Clojure 函数用作 Lambda 吗?

java - JSF 2.0 和 TransformerFactory

java - 模式 : Populate instance from Parameters and export it to XML

python - NewConnectionError(<URLlib3.connection.HTTPConnection对象位于0x7f09b9f0a7c0>:无法建立新连接:[Errno 111]连接被拒绝)

javascript - 如果元素存在于 DOM 中或者它是虚拟的(刚刚由 createElement 创建),如何使用 javascript 查找

java - 一个 Controller 用于不同的 View ?(MVC)

java - 将日期时间字符串转换为毫秒 UNIX 时间戳

c++ - 无法将 splitterChannel 与 poco 的高级 xml 配置一起使用

ruby-on-rails - 使用 XML 作为 Rails 模型的数据源

document - 文档与多个关键字的相关性