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?