3

Java JRE に存在する XML バリデーターが JRE 1.6u24 で非常に遅くなるという問題が発生し、これは最新の更新にも存在します。

1000 個の XML を検証するには、次の作業が必要です。

バージョン <= 1.6u23 では約 1.4 秒。バージョン >= 1.6u24 の場合、約 15.2 秒

これは10倍遅いです!誰かがすでに問題を見つけていないか検索しようとしましたが、何も見つかりません。

もちろん、woodstox のような別のライブラリを使用して回避することもできますが、純粋な JRE を優先したいと思います。改善が行われずにこれが長い間続くとは信じられません...

テストするコードは次のようになります。

public static void main(String[] args) throws XMLStreamException, SAXException, IOException, ParserConfigurationException {
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(new Source[] {
            new StreamSource(new File("schema1.xsd")),
            new StreamSource(new File("schema2.xsd")) });

    Validator validator = schema.newValidator();
    XMLInputFactory staxFactory = XMLInputFactory.newInstance();
    String xml = FileUtils.readFileToString(new File("to_validate.xml"), "UTF-8");

    Date start = new Date();
    for (int i = 0; i < 1000; i++) {
        XMLStreamReader xmlr = staxFactory.createXMLStreamReader(new StringReader(xml));
        StAXSource ss = new StAXSource(xmlr);
        validator.validate(ss);
    }
    Date end = new Date();

    System.out.println("seconds needed: " + (end.getTime() - start.getTime()) / 1000f);
}
4

1 に答える 1

0

I don't think Woodstox includes an XSD validator; if you want an alternative, you could try the Apache version of Xerces (which is usually far better than the JDK version), or Saxon-EE.

このようなスローダウンの最も可能性の高い理由は、W3C Web サイトから DTD を取得していることです。これが JDK のバージョン間で変更される理由はわかりませんが、約 1 年前に W3C が一般的な DTD の要求を故意に遅らせることで要求を抑制するというポリシー決定を行ったときに変更されたことは確かです。これが問題である場合の解決策は、カタログを使用してアクセスをローカル コピーにリダイレクトすることです。または、Saxon 9.4 を使用している場合は、最も一般的な DTD のコピーが組み込まれています。

于 2012-08-01T22:22:20.330 に答える