стандартная библиотека Java производит неправильно XML 1,1 - PullRequest
4 голосов
/ 14 февраля 2011

Я нашел эту интересную проблему на прошлой неделе.Запустите программу ниже.Это очень просто, сначала создайте фиктивный XML-файл, прочитайте его со стандартной библиотекой lib и запишите его обратно в файл.

Просмотрите созданный файл 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();
    }
}

1 Ответ

2 голосов
/ 14 февраля 2011

Я не знаю, что дает, но одна известная (?) Проблема с JDK состоит в том, что он часто включает в себя старые версии библиотек, таких как Xerces (анализатор XML) и Xalan (процессор XSLT).Хуже того, иногда это пользовательские версии, использующие старую версию в качестве базовой, и некоторый набор исправлений, поэтому трудно даже проверить, чего ожидать.

В результате, рекомендуется не полагаться на то, что в комплекте, аВместо этого явно используйте официальные версии Xerces / Xalas, чтобы убедиться, что используемая версия известна, и вы можете по крайней мере проверить, какие известные проблемы существуют.

Так что, возможно, вы можете использовать последние версии Xerces и Xalan, чтобы убедиться, что это не то, что былоисправлено ранее.

...