2012-04-01 5 views
6

Ich arbeite mit mehreren XElement-Objekten, um einige benutzerdefinierte Daten für mehrere Objekte in meiner Bibliothek bereitzustellen. Ich versuche, die Struktur der gesamten XML-Datei nicht zu spezifizieren, weil es der Bibliothek egal ist, wie die gesamte XML aussieht, solange die spezifischen Elemente, die sie benötigt, richtig strukturiert sind.XML-Schema Validierung von XElement

Zu diesem Zweck habe ich 3 separate XSD Dateien, die Schema für jeden der 3 XElements meine Klasse Bedürfnisse definieren, jedoch bin ich in einige Probleme läuft Validierung des XElement gegen das Schema. Es scheint keine Methode zu geben, dies ohne Umgehung zu tun.

Von der MSDN-Seite scheint die Erweiterungsmethode XElement.Validate() darauf ausgerichtet zu sein, Unterelemente einer größeren Datei erneut zu validieren. Das XmlSchemaObject Argument verursacht meine Probleme, da ich nicht davon ausgehen kann, dass es in jedem der XElements vorhanden sein wird. Ich denke, dass ich dieses Problem umgehen kann, indem ich die XmlSchemaElement von meinem XmlSchemaSet als das XmlSchemaObject Argument ergreife, aber da die bereits alles definiert, scheint es seltsam, dies zu tun.

Gibt es eine bessere Option für die Validierung eines XElement mit einem Schema ohne zuerst die gesamte XDocument zu validieren?

Oder sollte ich einfach die Business-Schicht mit der Schema-Validierung in der Anwendung und lassen Sie die Bibliothek die XElement ist richtig gebildet (ich dachte über diese Option, sondern als eine persönliche Präferenz lieber vermeiden Ausnahmen werfen und würde lieber nur lassen die aufrufende Methode weiß, dass die XElement über einen Rückgabeparameter ungültig ist).

Antwort

9

Ich verstehe das Problem, das Sie mit der bereitgestellten API haben, soweit ich es sehe, haben Sie zwei Möglichkeiten, eine ist Ihre XElement in eine XDocument mit z. XDocument doc = new XDocument(xElementToValidate); und dann the Validate method on that XDocument zu nennen, wo alles, was Sie in passieren ist die XmlSchemaSet, die zweite Option die Art und Weise, die du selbst umrissen, nämlich die Validate Methode des XElement zu verwenden, dafür, dass Sie in der XmlSchemaSet und das Wurzelelement Definition passieren in Dieses Schema wurde als XmlSchemaObject festgelegt. Wenn es sich um einfache Schemas mit nur einer Top-Level-Elementdefinition handelt, müssen Sie z.

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

Wenn Sie eine der beiden Ansätze in ein Verfahren wickeln, dann sollte es nicht mehr Aufwand als eine ähnliche Vereinfachungsmethode, die .NET-Framework geliefert Aufruf haben könnte.

+0

Ich habe keine Ahnung, warum ich nicht daran gedacht habe, den Code in meine eigene 'XElement.Validate() 'Extension-Methode einzubinden. Scheint so logisch jetzt, dass du es sagst. Ein 'XDocument' zu erstellen ist eine andere gute Idee, die zu mir hätte auftreten sollen (Ich habe zu viel Zeit damit verbracht, herauszufinden, wie man es konvertiert, und ich habe die offensichtliche Lösung verpasst). Ich werde mit beiden experimentieren und sehen, was ich bevorzuge. – psubsee2003