2012-04-12 12 views
2

私はスキーマファイルを解析しようとしていますが、誰かが助けてくれることを望んでいました。ここでXSDでXSDを解析する

は、XSDは、これは完全にはなく、アイデアを取得するのに十分ではありません

<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> 

のように見えるものです。ここでは、要素名を取得しようとしていたコードと、存在する場合は属性が続きますが、要素名のみが返されます。

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); 
      } 
     } 

これは----- E4 アンディは--- ----- E1 アンディ----- E2 アンディはE3 アンディを-----

アンディをoutputingされます - E5

私は出力

アンディ----- E1 アンディ----- E2 アンディ----- E3 アンディ----- E4にそれをしたいですAndy ----- E5 A1 A2 A3

ありがとうございます。

答えて

3

el.Elementsチェックのみ子要素、。あなたはDescendantsを使用するか、el.Elements(xs + "complexType").Elements(xs + "attribute")で完全なパスを指定する必要があります。

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

ありがとう、ありがとう! – AndySousa

1

スキーマを逆シリアル化する最も簡単な方法は、Visual Studio XSDコマンドラインユーティリティを使用することです。

XSD MySchema.xsd /クラス

/クラスがXSDは複数のクラスが含まれている場合に使用されるスイッチ:Visual Studioのコマンドプロンプトから、次のようなものを入力することができます。

この場合の出力は "MySchema.cs"というファイルになります。これには、XSDのジョブを実行できるXmlSerializerクラスが含まれます。

(の.xsdファイル自体は入力としての.xmlファイルの名前と同じユーティリティを呼び出すことによって生成された可能性があることに注意してください。)ので、そこには何も返さない

+0

私は自分の子属性を持つすべての要素名のスクリプトを生成しようとしています....しかし、クラスを望んでいません。 – AndySousa