2

私のプロジェクトの 1 つでは、XML を使用したデータ入力をサポートしています。XML はユーザー入力ファイルであるため、有効な XML である可能性が高くなりますが、セマンティック エラー (文字列の長さが許容制限を超えるなど) があります。

現在、javax.xml.validation.Validator を使用して指定されたドキュメントを検証していますが、1 つの要素にセマンティック エラーがある場合でも失敗します。私が望むのは、XML 全体をスキップするのではなく、そのような要素をスキップできるようにすることです。このようなエラーをスキップできる Validator のエラー ハンドラーを設定できることは理解していますが、これは、アプリケーション コードでセマンティック チェックを実行する必要があることを意味します。

私が考えることができる 1 つの解決策は、XSD を解析して一連の制限 (タイムスタンプ形式、長さチェックなど) を取得し、XML の解析中にこれらの制限をチェックすることです。この問題を解決するエレガントで明確な方法はありますか?

4

2 に答える 2

1

この状況ならできると思います

  1. 元の XSD を書き直して、必要なものだけを検証するようにします

  2. 独自の簡略化されたスキーマを使用します。それは単なるプロパティ ファイル、要素 = 規則、規則は正規表現であり、カスタム バリデータを作成します。本格的な XSD Validator よりも高速だと思います

  3. XML スキーマ言語は XSD だけではありません。Relax NG を検討してください。

于 2012-12-18T05:54:41.440 に答える
1

API ドキュメントではあまり明確に説明されていませんが、validate() メソッドに、検証したい要素をラップする DOMSource を指定すると、その要素の下のサブツリーのみを検証する必要があります。

これが validate() の JDK 実装の動作方法であると 100% 確信することはできませんが、Saxon XSD 実装が仕様を解釈する方法であることは確かです。

低レベルの Java API を使いたくない場合、特定の要素 (およびそのサブツリー) を検証する簡単な方法は、XQuery を使用することです。

for $e in //a/b/c[condition=foo] return validate{$e}

XQuery 3.0 では、try/catch を使用して、検証が失敗した場合を処理できます。

于 2012-12-18T08:42:19.483 に答える