Wie analysieren Sie ein XSD, um die Informationen von <xsd:simpleType> - Elemente, die mithilfe von C#?
Ich habe eine XSD mit mehreren komplexen Typen, und einfachen Typen (Teil der Datei siehe unten). Ich muss analysieren, dieses Dokument zu bekommen maxLength aus jedem der simpletypes, auf die verwiesen wird in die komplexen Typen. Kann jemand bitte werfen Sie einige Ratschläge, wie Sie diese umsetzen? Ich brauche, um dies zu implementieren, die in einer generischen Art und Weise so, wenn ich die Abfrage auf "Setup_Type" sollte es geben, die unten ausgegeben. Danke!
NewSetup/Menge = 12 (Die name-Attribute von element-tags, getrennt durch ein "/" und maxLength der geschachtelten simpleType)
NewSetup/Name = 50
<xsd:complexType name="Setup_Type">
<xsd:sequence>
<xsd:element name="NewSetup" type="NewSetup_Type" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="NewSetup_Type">
<xsd:sequence>
<xsd:element name="Amount" type="Amount_Type" minOccurs="1" maxOccurs="1" />
<xsd:element name="Name" type="Name_Type" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="Amount_Type">
<xsd:annotation>
<xsd:documentation>Amount</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="12" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="Name_Type">
<xsd:annotation>
<xsd:documentation>Name</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50" />
</xsd:restriction>
</xsd:simpleType>
- Danke an alle für die tollen Lösungen. Es war sehr hilfreich, sich an den code. So weit, ich habe versucht @psubsee2003 die Lösung und es funktioniert Super für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe ähnliche Fragen in der Vergangenheit (vollständige Offenlegung, ich habe Fragen eine ähnliche Frage mich). In der Analyse einer XSD ist nicht für das schwache des Herzens.
Haben Sie grundsätzlich 2 Möglichkeiten, die erste ist einfacher zu implementieren, aber kann gebrochen werden, mehr leicht durch geringfügige änderungen an der XSD. der 2. ist ein robuster, aber schwer zu implementieren.
Option 1:
Parsen der XSD mit LINQ (oder andere C# - XML-parser, wenn Sie bevorzugen). Da eine XSD ist nur eine XML ist, können Sie laden Sie Sie in einem
XDocument
und es gerade gelesen über LINQ.Nur für eine Stichprobe von eigenen XSD:
Können Sie den Zugriff auf die MaxLength:
Diese nicht bieten eine sehr einfache Methode für die Analyse von Typ-Namen, besonders für extended-Typen. Um diese zu verwenden müssen Sie wissen, den genauen Pfad für jedes element, die Sie suchen.
Option 2:
Dies ist viel zu Komplex für eine schnelle Antwort (Hinweis: siehe edit unten - ich hatte einige Zeit und zusammen eine funktionierende Lösung), so werde ich Sie dazu ermutigen, einen Blick auf meine eigene Frage, die ich weiter oben verlinkt. In es, ich verlinkte einen toller blog, das zeigt, wie ernst brechen die XSD in Stücke und vielleicht erlauben Sie zum ausführen der Art der Suche, die Sie möchten. Sie haben zu entscheiden, ob es der Mühe Wert ist, Sie zu entwickeln (das blog zeigt eine Implementierung mit
XmlReader
enthält eine XML-Datei validiert gegen XSD-Frage, aber Sie können ganz einfach erreichen dies durch direktes laden der XSD und analysieren es.2 entscheidende Idee zu finden, in dem blog sind:
Ich tatsächlich versucht, die gleiche Sache im letzten Jahr zu analysieren, eine XSD-Datei als Teil eines umfangreichen Daten-validation-Methode. Es hat mich den besseren Teil von einer Woche, um wirklich zu verstehen, was passiert war, eine Anpassung der Methoden in den blog, um für meine Zwecke. Es ist definitiv die beste Art der Umsetzung genau das, was Sie wollen.
Wenn Sie möchten, um zu versuchen, dies mit einem eigenständigen schema, laden Sie die XSD in ein
XmlSchemaSet
Objekt und verwenden Sie dannGlobalTypes
- Eigenschaft, um zu helfen, finden Sie die spezifische Art Sie sind auf der Suche nach.EDIT:
Ich zog meinen alten code und begann mit der Zusammenstellung der code, um Ihnen zu helfen.
Ersten Ihren laden schema:
Die folgenden Methoden sollten Sie in der Nähe, was Sie wollen, basierend auf dem XSD-Sie zur Verfügung gestellt. Es sollte ziemlich anpassungsfähig Umgang mit komplexeren Strukturen.
Dann die Verwendung ist ziemlich einfach, Sie brauchen nur zu rufen
GetElementMaxLength(String)
Methode und wird es wieder ein Wörterbuch der Namen in dem format, das Sie zur Verfügung gestellt, mit dem Wert der max Länge:MinOccurs
undMaxOccurs
sind Attribute von<element>
und<sequence>
und sind nicht verbunden mit einer Art überhaupt. Und dieParent
- Eigenschaft funktioniert nicht wie Sie denken, es tut. Muttergesellschaft ist die XML-Eltern, nicht das element, das den Typ zugeordnet ist (im realty Ihrem Typ zugeordnet werden konnten ein Dutzend verschiedene Elemente in der gleichen XSD, jede mit einer anderen MinOccurs oder MaxOccurs). Sie müssen feststellen, dass die spezifische element, das Sie suchen und bekommen das MinOccurs-direkt von ihm.Meine Lösung ist vielleicht nicht genau das, was Sie suchen. Wahrscheinlich möchten Sie lieber mit System.Xml Klassen, um solche Informationen. Ich weiß nicht, wie viel Generika Sie möchten diese parser werden, sowieso, das sind nur meine 2 Cent. Mein code gerade verwendet reguläre Ausdrücke entwickelt, um richtig zu Gesicht 99% der Möglichkeiten (denke ich). Jemand rufen würde dies wie das Schießen eine fliege mit einem Maschinengewehr. Sowieso ist es:
xs
stattxsd
...