2013-01-21 5 views
5

Ho un XDocument che convalido con uno schema XML. Quando XDocument non è valido, è necessario trovare i nodi XML non validi in modo che l'utente possa facilmente accedere alla rispettiva posizione nella mia applicazione (ad esempio facendo doppio clic su un messaggio nella griglia di un messaggio).Come trovare il nodo XML non valido in XDocument che viene convalidato su uno schema (XmlSchemaValidationException.SourceObject è null)

Io uso il metodo di estensione System.Xml.Schema.Validate() a tale scopo. Il secondo argomento del metodo Validate() è un System.Xml.ValidationEventHandler che viene chiamato su ogni elemento XML non valido. Passa a System.Xml.ValidationEventArgs. Il ValidationEventArgs.Exception può essere convertito in . Ora il XmlSchemaValidationException ha una proprietà SourceObject che mi aspettavo di contenere un riferimento al nodo XML non valido. Sfortunatamente è sempre nullo.

il seguente frammento illustra il mio utilizzo:

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 
        } 
       }); 

La convalida in sé funziona correttamente, ma non riesco a ottenere un riferimento sul nodo valido. Stranamente, lo stesso approccio funziona bene per System.Xml.XmlDocument, ma sfortunatamente devo lavorare con XDocument in questo contesto.

Qualcuno ha un suggerimento su come trovare il nodo non valido in XDocument?

risposta

6

OK, ho la risposta. Il nodo non valido è il "mittente" del gestore eventi stesso. Può essere lanciato su XContainer, XElement, ...