2013-01-21 32 views
5

XMLスキーマに対して検証するXDocumentがあります。 XDocumentが無効な場合、無効なXMLノードを見つけて、ユーザーがアプリケーション内のそれぞれの場所に簡単に移動できるようにする必要があります(メッセージグリッドのメッセージをダブルクリックするなど)。スキーマに対して検証されたXDocumentの無効なXMLノードを見つける方法(XmlSchemaValidationException.SourceObjectがnull)

私はその目的のためにSystem.Xml.Schema.Validate()拡張メソッドを使用します。 Validate()メソッドの2番目の引数は、無効なXML要素ごとに呼び出されるSystem.Xml.ValidationEventHandlerです。それはSystem.Xml.ValidationEventArgsを渡します。 ValidationEventArgs.Exceptionは、System.Xml.Schema.XmlSchemaValidationExceptionにキャストできます。今度は XmlSchemaValidationExceptionには無効なXMLノードへの参照を保持すると予想されるSourceObjectというプロパティがあります。残念ながら、常にnullです。

次のスニペットは、私の使用方法を示しています

XDocument doc = XDocument.Load(@"c:\temp\booksSchema.xml"); 

// Create the XmlSchemaSet class. 
XmlSchemaSet sc = new XmlSchemaSet(); 

// Add the schema to the collection. 
sc.Add("urn:bookstore-schema", @"c:\temp\books.xsd"); 

// Validate against schema 
doc.Validate(sc, delegate(object sender, ValidationEventArgs e) 
       { 
        XmlSchemaValidationException ve = e.Exception as XmlSchemaValidationException; 
        if (ve != null) 
        { 
         object errorNode = ve.SourceObject;  
         // ve.SourceObject is always null 
        } 
       }); 

検証自体は正常に動作しますが、私は無効なノードの参照を取得することはできません。不思議なことに、同じアプローチがSystem.Xml.XmlDocumentでもうまくいきますが、残念ながらこの文脈ではXDocumentと一緒に作業する必要があります。

無効なノードがXDocumentにどのように見つかるのか、誰にも示唆がありますか?

答えて

6

OK、私は答えがあります。無効なノードは、イベントハンドラの「送信側」自体です。それは、XContainer、XElement、にキャストすることができます...

関連する問題