0

私は少しXSDを学ぼうとしていて、このxml用のXSDを作成しようとしています。

<Document>
  <TextBox Name="Username" />
  <TextBox Name="Password" />
</Document>

...つまり、抽象的な複合型である要素があります。すべての要素には要素などがあります。DocumentTextBox拡張していElementます。

私はこれを試しました:

<?xml version="1.0" encoding="utf-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Document">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Element">

        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Element" abstract="true">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Element" type="Element"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="TextBox">
    <xs:complexContent>
      <xs:extension base="Element">
        <xs:attribute name="Name" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

Xsd2Codeを使用してC#にコンパイルし、逆シリアル化しようとしました。

var serializer = new XmlSerializer(typeof(Document));

var document = (Document)serializer.Deserialize(new FileStream("Document1.xml", FileMode.Open));

foreach (var element in document.Element1)
{
    Console.WriteLine(((TextBox)element).Name);
}

Console.ReadLine();

そしてそれは何も印刷しません。私がそのようにそれをシリアル化しようとすると:

var serializer = new XmlSerializer(typeof(Document));

var document = new Document();

document.Element1 = new List<Element>();

document.Element1.Add(new TextBox()
{
    Name = "abc"
});

serializer.Serialize(new FileStream("d.xml", FileMode.Create), document);

...出力は次のとおりです。

<?xml version="1.0"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Element1>
    <Element xsi:type="TextBox">
      <Element1 />
      <Name>abc</Name>
    </Element>
  </Element1>
</Document>

次のような場合:

<?xml version="1.0"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TextBox Name="abc" />
</Document>

xsdまたは別のコードジェネレーターを修正する方法はありますか?

ありがとう。

4

1 に答える 1

0

XSD コードで、"Element" という名前の要素を宣言している行を見てください。XML ファイルで<xs:element name="TextBox" />使用する場合は、この要素にそのような名前を付ける必要があります。<TextBox/>

xsd.exe /c YourFile.xsd上記の変更を実装すると、実行して XSD から C# クラスを生成できます。生成されたファイルを C# プロジェクトに含めると、次のように使用できるようになります。

  Document d = new Document();
  d.TextBox = new TextBox[]
  {
    new TextBox() { Name = "Username" },
    new TextBox() { Name = "Password" },
  };
  XmlSerializer ser = new XmlSerializer(typeof(Document));            
  ser.Serialize(Console.Out, d);

XML をデシリアライズして C# オブジェクトに戻すこともできます。

<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <TextBox xsi:type="TextBox" Name="Username" />
  <TextBox xsi:type="TextBox" Name="Password" />
</Document>

属性に注意してください。要素の型xsi:typeを宣言したため、これらの要素の 1 つを逆シリアル化するときに使用する具体的な型の実装を指定する必要があります。好奇心から、TextBox という名前の要素の XSD 型を TextBox 型に変更しようとしましたが、StackOverflowException がスローされました。私は笑いました。おそらく Element と TextBox の間の再帰型の関係に関係していますが、別のツールでは別の方法で処理されるのではないでしょうか?TextBoxElementxsd.exe

于 2010-04-11T22:59:35.633 に答える