Mam XDocument
, które sprawdzam w odniesieniu do schematu XML. Kiedy XDocument
jest nieważny, muszę znaleźć nieprawidłowe węzły XML, aby użytkownik mógł łatwo przejść do odpowiedniego miejsca w mojej aplikacji (np. Dwukrotnie klikając wiadomość na siatce komunikatów).Jak znaleźć nieprawidłowy węzeł XML w XDocument, który jest sprawdzany pod względem schematu (XmlSchemaValidationException.SourceObject ma wartość null)
Do tego celu używam metody rozszerzenia System.Xml.Schema.Validate()
. Drugi argument metody Validate() to System.Xml.ValidationEventHandler
, który jest wywoływany na każdym nieprawidłowym elemencie XML. Przekazuje System.Xml.ValidationEventArgs
. Numer ValidationEventArgs.Exception
można odlać na System.Xml.Schema.XmlSchemaValidationException
. Teraz XmlSchemaValidationException
ma właściwość SourceObject
, której oczekiwałem, że będzie zawierał odniesienie do nieprawidłowego węzła XML. Niestety jest zawsze zerowy.
Poniższy urywek ilustruje moje Zastosowanie:
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
}
});
Sam walidacja działa poprawnie, ale nie mogę uzyskać odwołanie na nieprawidłowym węzła. O dziwo, to samo podejście działa dobrze dla System.Xml.XmlDocument
, ale niestety muszę pracować z XDocument
w tym kontekście.
Czy ktoś ma sugestię, jak można znaleźć nieprawidłowy węzeł w XDocument
?