4

先週、この興味深い問題を見つけました。以下のプログラムを実行します。非常に簡単で、まずダミーの 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();
    }
}
4

1 に答える 1

2

何が得られるかはわかりませんが、JDKのよく知られた(?)問題の1つは、Xerces(XMLパーサー)やXalan(XSLTプロセッサー)などの古いバージョンのライブラリーが含まれていることが多いことです。さらに悪いことに、これらはベースラインとして古いバージョンを使用するカスタムバージョンであり、パッチのセットもあるため、何を期待するかを確認することさえ困難です。

その結果、バンドルされているものに依存するのではなく、公式のXerces / Xalasバージョンを明示的に使用して、使用されているバージョンが既知であり、少なくとも既知の問題が存在するかどうかを確認できるようにすることをお勧めします。

したがって、最新のXercesバージョンとXalanバージョンを使用して、以前に修正されたものではないことを確認できます。

于 2011-02-14T04:33:09.317 に答える