4

私はスキーマファイルを解析しようとしてかなりの時間を過ごしています...誰かが助けてくれることを望んでいました。

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

これは出力中です

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

出力したい場所

アンディ-----E1アンディ-----E2アンディ-----E3アンディ-----E4アンディ-----E5A1 A2 A3

前もって感謝します。

4

2 に答える 2

4

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);
    }
}
于 2012-04-12T18:13:00.717 に答える
1

スキーマを逆シリアル化する最も簡単な方法は、Visual Studio XSD コマンド ライン ユーティリティを使用することです。Visual Studio コマンド プロンプトから、次のように入力できます。

xsd MySchema.xsd /CLASSES

/CLASSES スイッチは、xsd に複数のクラスが含まれている場合に使用されます。

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

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

于 2012-04-12T18:12:51.317 に答える