Ich habe eine XSD mit mehreren komplexen Typen und einfachen Typen (Teil der Datei, die unten gezeigt wird). Ich muss dieses Dokument analysieren, um maxLength von jedem der SimpleTypes zu erhalten, auf die in den komplexen Typen verwiesen wird. Kann jemand bitte einen Ratschlag geben, wie man das umsetzt? Ich muss dies in einer generischen Weise implementieren, wenn ich nach "Setup_Type" frage, sollte es die folgende Ausgabe geben. Danke!
NewSetup / Amount = 12 (Die Namenattribute von Element-Tags getrennt durch "/" und maxLength vom verschachtelten simpleType)
Neuer Setup / Name = 50
%Vor%Ich habe ähnliche Fragen in der Vergangenheit gesehen (vollständige Offenlegung, ich habe eine ähnliche Frage selbst gestellt). Das Parsen einer XSD ist nichts für schwache Nerven.
Sie haben grundsätzlich 2 Möglichkeiten, die erste ist einfacher zu implementieren, kann aber leichter durch kleinere Änderungen an der XSD unterbrochen werden. der 2. ist robuster aber schwer zu implementieren.
Option 1:
Analysieren der XSD mit LINQ (oder einem anderen C # XML-Parser, wenn Sie dies bevorzugen). Da ein XSD nur ein XML ist, können Sie es in ein XDocument
laden und es einfach über LINQ lesen.
Nur ein Beispiel Ihrer eigenen XSD:
%Vor%Sie können auf MaxLength zugreifen:
%Vor%Dies bietet keine sehr einfache Methode zum Parsen nach Typnamen, besonders für erweiterte Typen. Um dies zu verwenden, müssen Sie den genauen Pfad für jedes Element kennen, nach dem Sie suchen.
Option 2:
Das ist viel zu komplex für eine schnelle Antwort (Hinweis: siehe unten - ich hatte etwas Zeit und habe eine funktionierende Lösung zusammengestellt) , also werde ich euch ermutigen, auf meine Seite zu schauen eigene Frage, die ich oben verlinkt habe. Darin habe ich ein tolles Blog verlinkt, das zeigt, wie man das XSD ernsthaft zusammenbrechen lässt in Stücke und könnte Ihnen erlauben, die Art der Suche, die Sie wollen, durchzuführen. Sie müssen entscheiden, ob es sich lohnt, sie zu entwickeln (das Blog zeigt eine Implementierung mit XmlReader
, die eine XML-Datei enthält, die für die fragliche XSD validiert wurde, aber Sie können dies einfach durch direktes Laden der XSD und Parsing durchführen .
2 Schlüsselidee im Blog zu finden sind:
%Vor%Ich habe letztes Jahr das Gleiche versucht, um eine XSD als Teil einer komplizierten Datenvalidierungsmethode zu analysieren. Ich brauchte den größten Teil einer Woche, um wirklich zu verstehen, was passierte, um die Methoden im Blog an meine Zwecke anzupassen. Es ist definitiv der beste Weg, genau das zu implementieren, was Sie wollen.
Wenn Sie dies mit einem eigenständigen Schema versuchen möchten, können Sie das XSD in ein Objekt XmlSchemaSet
laden und dann mithilfe der Eigenschaft GlobalTypes
den gesuchten Typ finden.
BEARBEITEN: Ich zog meinen alten Code hoch und begann, den Code zusammenzustellen, um Ihnen zu helfen.
Zuerst laden Sie Ihr Schema:
%Vor%Die folgenden Methoden sollten Ihnen basierend auf dem von Ihnen bereitgestellten XSD nahe bringen, was Sie wollen. Es sollte ziemlich anpassungsfähig sein, um mit komplexeren Strukturen umgehen zu können.
%Vor% Dann ist die Verwendung ziemlich einfach, Sie müssen nur die Methode GetElementMaxLength(String)
aufrufen und es wird ein Wörterbuch der Namen in dem von Ihnen angegebenen Format mit dem Wert als maximale Länge zurückgegeben:
Meine Lösung ist möglicherweise nicht genau das, wonach Sie suchen. Wahrscheinlich würden Sie lieber System.Xml-Klassen verwenden, um solche Informationen zu verarbeiten. Ich weiß nicht, wie viel Generika dieser Parser sein soll, jedenfalls sind das nur meine 2 Cent. Mein Code verwendet nur reguläre Ausdrücke, die so entworfen wurden, dass sie 99% der Möglichkeiten korrekt darstellen (ich schätze). Jemand würde das wie eine Fliege mit einer Pistole schießen nennen. Wie auch immer das ist es:
%Vor%