14

Java で XMLSchema に対して検証を行っていますが、無効なコンテンツ モデルがあると SAXParseExceptions がスローされます。

これらの例外を使用して、検証が失敗した場所を強調しますが、SAXParseExceptions は少しレベルが低すぎるようです。

たとえば、列挙の失敗の場合、提供された値が 1 つの例外でコンテンツ モデルと一致せず、次の例外でそれが適用される要素と一致しないという有効性エラーが発生します。

関連するエラーをまとめてマージし、例外テキストを使用可能な例外プロパティに解析するために、少し抽象化するユーティリティが必要だと考えています。

これは合理的なアプローチですか、それとも何か不足しているだけですか、それともライブラリまたはヘルパー クラスですか?


@timgilbert を更新してください。返信ありがとうございます。

たとえば、インターネットで見つけた SAXParseException

cvc-pattern-valid: Value 'en' is not facet-valid
with respect to pattern '([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*'

私にとって重要なことは

  • この例外が適用される要素「en」。exception.getElement() などを呼び出せないのはなぜですか? また、問題の要素への XPath を呼び出せないのはなぜですか? 行番号と列番号よりもメモリ内ドキュメントの方が便利です!
  • パターン検証の失敗です。考えられる失敗の種類の列挙と適切な失敗への参照のようなものを取得できないのはなぜですか?
  • 検証が失敗した実際のパターン。
  • 次に別の例外がスローされ、マージする必要がある問題の原因となった「en」要素の値が通知されます

私ができるようにしたいことの例は、人々にドキュメントを送信してもらい、検証が失敗した場所でユーザーフレンドリーなメッセージでドキュメントを強調表示することです-上記のエラーメッセージはあまりフレンドリーではないようです...解析する必要があります一重引用符で囲むと、事故が起こるのを待っているように感じます:)

「要素への参照」のやり方が間違っているのではないかと思います。おそらく、検証の一部としてデフォルトでドキュメントのアイデンティティ変換を行い、検証エラー属性で変換を強化する必要がありますCSSで抽出できます。メッセージをより使いやすくするためにメッセージを解析する必要がある場合、それでも役に立ちません...

Re: タイト バインディング、javax.xml.validation.Validator.validate() はとにかく org.xml.sax.SAXException をスローします。

乾杯

4

2 に答える 2

1

ここで何を求めているのか完全にはわかりませんが、例外が低レベルすぎるということの意味についてもう少し詳しく説明していただけますか? エラーメッセージ自体がわかりにくいということでしょうか。

SaxParseException クラスには getColumnNumber() および getLineNumber() メソッドがあり、ユーザーに提示してエラーを修正してもらうことができます。

試してみるとよいことの 1 つは、さまざまな XML 解析実装を使用することです。すべてのパーサーは、無効なコードを検出するとエラーをスローしますが、実装が異なれば、エラー メッセージと例外チェーンも異なる可能性があります。

実際、この理由から、例外チェーンを検査し、それからより首尾一貫したエラー メッセージを構築しようとするライブラリを構築しようとすることに疑問を抱くでしょう。 XML 解析の実装 (特に、エラー メッセージの特定の言い回しに依存している場合)。

(申し訳ありませんが、これはより具体的ではありません。おそらく、あなたが見ている問題の例を挙げていただけますか?)

于 2009-04-08T19:22:29.163 に答える
1

Brabster 私も同様の問題に直面し、xml のどの要素に対してエラーが発生したかを伝える必要があります。SAX パーサーのハンドラーでスタックを維持することで、この問題を少し解決しました。startElement メソッドでは qName (要素の名前) をスタックにプッシュし、endElement メソッドではスタックから qName をポップします。

例外が発生するたびに、スタックは要素の完全な XPath を表します。

唯一の問題は、同じ名前の要素が複数ある場合、エラーがどの要素に対するものかがわからないことでした。しかし、少なくとも XPath の完全な詳細は、LineNumber と ColumnNumber とともに役に立ちました。

お役に立てれば。

于 2009-12-09T04:38:22.667 に答える