2

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

エラーは非常に簡潔で、次のようになります。

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

などの他のメッセージ

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

さらに謎めいた。

ここで何が悪かったのかを説明する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);
}
4

1 に答える 1

0

はデフォルトの名前空間xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd "であるため、XMLドキュメントに追加する必要があったようです。もちろん、XMLを生成するツールを変更するためのアクセス権がないため、次の醜いハックが必要でした。s:http://www.mycompany.com/schemaxmlns="s:http://www.mycompany.com/schema"

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

...もちろん、二重の検証エラーが発生しています。次のような明確でわかりやすいもの:

cvc-complex-type.2.4.a:要素's:cID'で始まる無効なコンテンツが見つかりました。'{"http://www.mycompany.ca/schema":tdr}'のいずれかが必要です。

直後に:

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

The double-error is annoying but at least the first one is usable...

于 2010-11-29T21:56:35.307 に答える