2013-01-21 10 views
5

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?

Odpowiedz

6

OK, mam odpowiedź. Niepoprawny węzeł jest samym "nadawcą" modułu obsługi zdarzenia. Może być rzutowany na XContainer, XElement, ...