2010-11-26 14 views
2

XMLをXSDに対して検証するJavaコードがあります。私はここで見つけたエラーハンドラの修正バージョンを使用しています:http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.htmlは、検証中にすべての例外をキャッチしてログに記録します。SAX例外の翻訳

エラーは非常に簡潔です、彼らはこのような何かを見て:そのよう

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:attributes&{"http://www.myschema.com/schema":sequence} 

として

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.myschema.com/schema":txn} 

その他のメッセージはさらに不可解です。

ここで何が問題になったのかを説明する簡単でわかりやすいメッセージをSAXから入手できますか?私は、最初のエラーではtxnが期待され、その代わりに要素cIDが見つかったと思います。しかし、私はSAXによって生成される可能性のあるエラーをすべて知っているわけではないので、私は手動で翻訳テーブルを作成しようとしません。

この出力の最終的なユーザーはほとんど技術的ではないため、「要素txnが順序が狂った」などの単純で明確なメッセージを生成する必要があります。それが助け場合

が、ここではコードです(多かれ少なかれ)それは検証のために使われています:...他の場所

Source schema1 = new StreamSource(new File("resources/schema1.xsd")); 
Source schema2 = new StreamSource(new File("resources/schema2.xsd")); 
Source[] sources = {schema1,schema2}; 
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sources).newValidator(); 
ErrorHandler lenient = new ForgivingErrorHandler(); 
validator.setErrorHandler(lenient); 

StreamSource xmlSource = new StreamSource(new StringReader(XMLData)); 
try 
{ 
    validator.validate(xmlSource); 
} 
catch (SAXException e) 
{ 
    logger.error("XML Validation Error: ",e); 
} 

答えて

0

まあ、私がにxsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd "を追加しなければならなかったようですXML文書の場合、というデフォルトの名前空間はs:http://www.mycompany.com/schemaです。もちろん、私は、XMLを生成するツールを変更するためのアクセス権を持っていないので、以下の醜いハックが必要であった:

xmlDataStr = xmlDataStr.replace("<rootNode ", "<rootNode xsi:schemaLocation=\"http://www.mycompany.com/schema resources/schema1.xsd \" "); 

...もちろん、今私は二重の検証エラーを取得しています!

直ちに続く
 
cvc-complex-type.2.4.a: Invalid content was found starting with element 's:cID'. One of '{"http://www.mycompany.ca/schema":tdr}' is expected. 

:ダブルエラーが迷惑であるが、少なくとも最初のものが使用可能である...

 
http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr} 

ようなはっきりと理解1