XSD に対して XML ドキュメントを検証するためにXDocument.Validate (XmlDocument.Validate と同じように機能するようです) を使用しています。これはうまく機能し、検証エラーが通知されます。
ただし、一部の情報のみが [確実に] ValidationEventHandler (および XmlSchemaException) で公開されているようです。
- エラーメッセージ (つまり、「'X' 属性が無効です - 値 'Y' はそのデータ型 'Z' に従って無効です - パターン制約に失敗しました」)、
- 重大度
私が望むのは、検証の失敗の「失敗した XPath」を取得することです (それが理にかなっています)。つまり、(XML テキストではなく) XML ドキュメントに関連して失敗を取得したいと考えています。
から「失敗した XPath」情報を取得する方法はありXDocument.Validate
ますか? XmlValidatingReader
そうでない場合、 1などの別の XML 検証メソッドを使用して「失敗した XPath」を取得できますか?
バックグラウンド:
JSON から XML への自動変換 (JSON.NET 経由) により、XML はデータとして Web サービスに送信されます。このため、元の JSON データのために順序が保証されていないテキストではなく、XDocument データ1の処理を開始します。REST クライアントは、詳しくは触れたくありませんが、基本的には XML ドキュメントに対する HTML フォーム フィールドのラッパーであり、サーバーでの検証は XML スキーマの検証とビジネス ルールの検証の 2 つの部分で行われます。
ビジネス ルールの検証では、適合に失敗したフィールドの "XPath" を返すのは簡単です。これを使用して、クライアントの失敗したフィールドを示すことができます。これを XSD スキーマの検証に拡張したいと思います。これは、基本的な構造の検証、さらに重要なことに、属性の基本的な「データ型」と「存在」を処理します。ただし、必要な自動プロセス (適切なエラー フィールドの強調表示) とソース変換のため、生のテキスト メッセージとソースの行/列番号は、それ自体ではあまり役に立ちません。
検証コードのスニペットを次に示します。
// Start with an XDocument object - created from JSON.NET conversion
XDocument doc = GetDocumentFromWebServiceRequest();
// Load XSD
var reader = new StringReader(EmbeddedResourceAccess.ReadResource(xsdName));
var xsd = XmlReader.Create(reader, new XmlReaderSettings());
var schemas = new XmlSchemaSet();
schemas.Add("", xsd);
// Validate
doc.Validate(schemas, (sender, args) => {
// Process validation (not parsing!) error,
// but how to get the "failing XPath"?
});
更新: 「ドキュメントの検証中に XML スキーマ情報にアクセスする」 ( cached ) にリンクするXDocument を検証するときにスキーマ情報をキャプチャすることがわかりました。
XmlSchemaExceptionは、SourceObject プロパティを持つXmlSchemaValidationExceptionに特化できますが、これは検証中に常に null を返します。
ドキュメントを ( 経由で
XmlReader.Read
) 読み、検証コールバックの前にパスを「記憶」できます。これは初期テスト (ValidationCallback なし) では「機能しているように見えます」が、私には非常に洗練されていないように感じますが、他にはほとんど見つけることができませんでした。