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
にどのように見つかるのか、誰にも示唆がありますか?