2012-04-12 10 views
2

Ich habe eine Zeit lang versucht, eine Schemadatei zu analysieren ... hoffte, dass jemand helfen könnte.Analysiere XSD mit XDocument

Hier ist, was die XSD sieht aus wie

<xs:element name="E1"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="E2" nillable="true" minOccurs="0"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="E3" minOccurs="0" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element name="E4" nillable="true" minOccurs="0"> 
             <xs:complexType> 
              <xs:sequence> 
               <xs:element name="E5" minOccurs="0" maxOccurs="unbounded"> 
                <xs:complexType> 
                 <xs:attribute name="A1" type="xs:integer" use="optional" /> 
                 <xs:attribute name="A2" type="xs:string" use="optional" /> 
                 <xs:attribute name="A3" type="xs:string" use="optional" />\ 
                </xs:complexType> 
               </xs:element> 
              </xs:sequence> 
             </xs:complexType> 
            </xs:element> 
           </xs:complexType> 
          </xs:element> 
         </xs:complexType> 
        </xs:element> 

Dies ist nicht vollständig, aber genug, um die Idee zu bekommen. Hier ist der Code, den ich versuchte, den Elementnamen zu erhalten, gefolgt von irgendwelchen Attributen, wenn sie existierten, aber dies gibt nur die Elementnamen zurück.

var xs = XNamespace.Get("http://www.w3.org/2001/XMLSchema"); 
var doc = XDocument.Load(sourceName + sourceApi + "Input.txt"); 
     foreach (var el in doc.Descendants(xs + "element")) 
     { 
      Trace.WriteLine("ANDY ------ " + el.Attribute("name").Value); 
      foreach (var attr in el.Elements(xs + "attribute")) 
      { 
       Trace.WriteLine(attr.Attribute("name").Value); 
      } 
     } 

Dies wird outputing

Andy ----- ----- E1 Andy E2 Andy ----- ----- E3 Andy E4 Andy --- - E5

Wo ich es Ausgabe

Andy ----- E1 Andy ----- E2 Andy ----- E3 Andy ----- E4wollenAndy ----- E5 A1 A2 A3

Vielen Dank im Voraus.

Antwort

3

el.Elements prüft nur die untergeordneten Elemente, es so gibt nichts zurück. Sie sollten Descendants oder geben Sie vollständigen Pfad von el.Elements(xs + "complexType").Elements(xs + "attribute") verwenden:

var xs = XNamespace.Get("http://www.w3.org/2001/XMLSchema"); 
var doc = XDocument.Load(sourceName + sourceApi + "Input.txt"); 
foreach (var el in doc.Descendants(xs + "element")) 
{ 
    Trace.WriteLine("ANDY ------ " + el.Attribute("name").Value); 
    foreach (var attr in el.Elements(xs + "complexType").Elements(xs + "attribute")) 
    { 
     Trace.WriteLine(attr.Attribute("name").Value); 
    } 
} 
+0

Danke Danke !!! – AndySousa

1

Ich habe festgestellt, dass die einfachste Möglichkeit zum Deserialisieren des Schemas mit dem Visual Studio XSD-Befehlszeilendienstprogramm ist.

xsd Myschema.xsd/KLASSEN

Die/KLASSEN-Schalter wird verwendet, falls der XSD enthält mehrere Klassen: Von einer Eingabeaufforderung Visual Studio Befehl, können Sie so etwas wie ein.

Die Ausgabe in diesem Fall wäre eine Datei namens "MySchema.cs". Dies wird eine XmlSerializer-Klasse enthalten, die die Aufgabe des XSD ausführen kann.

(Beachten Sie, dass die XSD-Datei selbst durch den Aufruf den gleichen Nutzen mit dem Namen einer XML-Datei als Eingabe erzeugt worden sein könnte.)

+0

ich eine Klasse nicht obwohl will .... Ich versuche, ein Skript von allen Elementnamen mit ihrem Kind Attribut zu erzeugen. – AndySousa