1

.Net Framework 4.0のExtenstions.GetSchemaInfo メソッド (XElement)に関する Microsoft の MSDN ドキュメントについて質問があります。

中から抜け道があるか知りたい

Private Sub DumpInvalidNodes(ByVal el As XElement)
   If el.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
     ...
   End If
End Sub

無効なノードの ValidationEventArgs.Message を取得するコード。この例は、GrandChild1、GrandChild2 のように XML ノードに番号を付けた場合にうまく機能します。どの無効なノードが検証エラーを生成しているかをサイトごとに判断できます。しかし、番号付けされたノードのない XML がある場合、たとえば

<Root>
    <Child>
        <GrandChild>AAA</GrandChild>
        <GrandChild>ZZZ</GrandChild>
        <GrandChild>ZZZ</GrandChild>
    </Child>
</Root>

次のような出力が得られます。

(1)Validating doc1 ... 
(2)The 'GrandChild' element is invalid - The value 'ZZZ' is invalid according to its datatype 'GCType' - The Enumeration constraint failed. 
(3)The 'GrandChild' element is invalid - The value 'ZZZ' is invalid according to its datatype 'GCType' - The Enumeration constraint failed. 
(4)doc1 did not validate 
(5)Invalid Element /Root 
(6)Invalid Element /Root/Child 
(7)Invalid Element /Root/Child/GrandChild 
(8)Invalid Element /Root/Child/GrandChild 

行 (7) が行 (2) の ErrorMessage を参照していることを伝える方法が必要でした。

この記事が示すように、XSD 検証を実行している XML ドキュメントがあり、ValidationEventArgs.Message を解析して、複雑なデータ型のよりユーザー フレンドリなメッセージにしたいと考えました。DumpInvalidNodes() メソッドでこれを行いたいのは、無効なノードにアクセスでき、ユーザーが検証の問題を見つけて修正するために使用できるノードから他の情報 (ID など) を取得できるためです。

4

1 に答える 1

0

最も簡単な方法は、元のコードを変更し、後でノードのダンプを行う代わりに、検証ハンドラーで行うことです。検証メッセージとノードを同時に提供します (送信者を XObject にキャストし、必要に応じて処理するだけです)。

ファイルまたは文字列から読み込まれた XML については、こちらの MSDN 記事を使用することもできます。行番号や列の位置など、ユーザーへの追加のヒントも役立ちます。

于 2011-10-16T04:43:02.863 に答える