2017-08-17 1 views
1

大きなXSDに対して大きなXML文書をすばやく検証しようとしています。 XMLは500〜39000行のどこにでも置くことができ、XSDは2000〜3000行の領域にあります。大きなXSDに対して大きなXMLファイルを検証するには、これをすばやく行う方法はありますか?

これまでの結果ではパフォーマンスが著しく低下しました。このような大きなXSDを持つパーサーの初期化には最大30秒かかることがありますが、これを1回実行してから注入することができます。

しかし、これを実際にXMLの検証に使用する場合、実装に応じて30秒から2分の任意の時間がかかります。

これは、コマンドラインツールと呼ばれるxmllintとして本当に奇妙です: xmllint --schema test.xsd valid.xml が同じ仕事をすることができますが、すぐに終了します。

私はJDOMライブラリ、SAXReader方法を試してみたと私はjdom2ものに落ち着いてきた、ここで私はそれを構築しています方法は次のとおりです。

URL xsd = Resources.getResource("test-xml/test.xsd"); 
XMLReaderJDOMFactory factory = new XMLReaderXSDFactory(xsd); 
builder = new SAXBuilder(factory); 

そして、ここでは、アクションで解析です

InputStream stream = new ByteArrayInputStream(inputXml.getBytes()); 
Document document = builder.build(stream); 

builder.build部分は、境界線の瞬間である必要がある行です。

目的の解決策の観点からは、出力が読みやすく素早い限り、C、Kotlinを使用しても構いません。

おかげ

+0

ことで解析するのにかかった50秒よりも著しく低いですWebから:おそらくW3C WebサイトのXML名前空間のスキーマなどのリソース。 W3Cは意図的にそのような要求を減速させ、それらを落胆させます。フェッチしているリソース(ネットワーク監視など)を見つけ、ローカルコピーで置き換えます。 –

+0

ちなみに、XMLファイルとXSDファイルのどちらも「大」とは記述しません。サイズは私にとっては非常に控えめなようです。 –

+0

ねえ、私たちはその理由を知ったので、私はただその答えを今作っています。 –

答えて

0

だから答えはダウンし、具体的maxOccursの値XSD、内部で実際にあったものになりました。ある時点で、maxOccursはすべて4999に設定され、ここで報告されたバグが発生します。http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6483188

maxOccursの実際の数があなたに関係しない場合、maxOccursの値を「無制限」に変更できます。または、maxOccursの値を小さくすることができます。マシンのmaxOccursの値が1000の場合、結果の解析には約1秒、その後の解析では約300msの結果が得られます。無制限でも300msにあります。

これは、それがmaxOccursの値は、それは確かに長いことを取るべきではない、と私の疑惑は、検証の過程で、あなたがリソースを取得していることだろう4999

+0

はい、minOccursとmaxOccursの大きな有限値は、従来のFSAベースのアルゴリズムに問題を引き起こします。 Saxonスキーマバリデーターは通常それに対処しますが、 '(x occur {1000,2000})が発生する{40、50}'などの病理学的なケースでは対応しません。 –

関連する問題