2013-01-21 13 views
5

Ich habe einen XDocument, den ich gegen ein XML-Schema validiere. Wenn die XDocument ungültig ist, muss ich die ungültigen XML-Knoten finden, damit der Benutzer leicht zu dem entsprechenden Platz in meiner Anwendung navigieren kann (z. B. durch Doppelklicken auf eine Nachricht in einem Nachrichtenraster).Wie finde ich einen ungültigen XML-Knoten in XDocument, der gegen ein Schema validiert wurde (XmlSchemaValidationException.SourceObject ist null)

Ich verwende die Extension-Methode System.Xml.Schema.Validate() für diesen Zweck. Das zweite Argument der Validate() -Methode ist eine System.Xml.ValidationEventHandler, die bei jedem ungültigen XML-Element aufgerufen wird. Es passiert eine System.Xml.ValidationEventArgs. Die ValidationEventArgs.Exception kann zu System.Xml.Schema.XmlSchemaValidationException gegossen werden. Jetzt hat die XmlSchemaValidationException eine Eigenschaft SourceObject, die ich erwartete, eine Referenz auf den ungültigen XML-Knoten zu halten. Leider ist es immer Null.

Der folgende Ausschnitt zeigt meine Nutzung:

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

Die Validierung selbst richtig funktioniert, aber ich kann nicht einen Verweis auf den ungültigen Knoten erhalten. Seltsamerweise funktioniert derselbe Ansatz gut für System.Xml.XmlDocument, aber leider muss ich in diesem Zusammenhang mit XDocument arbeiten.

Hat jemand einen Vorschlag, wie der ungültige Knoten in XDocument gefunden werden kann?

Antwort

6

OK, ich habe die Antwort. Der ungültige Knoten ist der "Sender" des Ereignisbehandlers selbst. Es kann in XContainer, XElement, ...

umgewandelt werden