1

一般的な属性 (名前、タイプなど) が指定された xml があります。属性の値は、xml が逆シリアル化されるプロパティである必要があります。

クラスにプッシュしようとしている xml のタイプのサンプルは次のようになります。

<root>
    <company>
        <location>USA</location>
        <name>TopCars</name>
    </company>
    <CarList name="CarCounts">
        <ModelList name="Models">
            <Column name="Ford">50</Column>
            <Column name="Chevy">65</Column>
            <Column name="Dodge">75</Column>
        </ModelList>
    </CarList>
</root>

私が使用したいくつかのサンプル コードを提供できますが、機能せず、いくつかの新しい見通しが必要です。とにかく欲しいものではない属性「名前」で識別される単一のプロパティを持つクラスによってデシリアライズされた xmlReader を使用していました。最終的には、Ford、Chevy、および Dodge のプロパティを含む Class Models のようなものが必要です (ここで車の構造に反対する場合、これはでっち上げの例です)。

XSDは、私が期待するようなものですが、実際には私が望むものではありません:

[...]
<xs:element name="Column" nillable="true" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType>
    <xs:simpleContent msdata:ColumnName="Column_Text" msdata:Ordinal="1">
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>
[...]

私はこのテクニックに縛られていません。私はC#で開発しています。

どんな助けでも大歓迎です。

@RichardTowers: リストされた xml で次のことを試しましたが、「XML ドキュメントにエラーがあります (1, 2)」というエラーが表示されました。

Base.Root[] cars = null;
XmlSerializer serializer = new XmlSerializer(typeof(Base.Root[]));
XmlReader reader = XmlReader.Create(new StringReader(xml));
cars = (Base.Root[])serializer.Deserialize(reader);
reader.Close();

xmlElementAttribute デコレータで提案したクラスを変更して、xmlString の先頭に "" を追加しようとしました。また、StringReader を StreamReader に切り替えてみましたが、役に立ちませんでした。他の提案はありますか?

4

1 に答える 1

2

あなたがしたいことは、逆シリアル化がどのように機能するかではありません。一方には XML があり、もう一方には C# クラスがあります。シリアライザーがその仕事をするためには、それらは互いに似ている必要があります。

あなたは次のようなクラスが欲しいと言います:

class Models
{
    int Chevy { get; set; } //65
    int Dodge { get; set; } //75
}

まず、XML をこのようなものにシリアライズすることは不可能だと思います。しかし、たとえそうであったとしてもMercedes、代わりに XML が含まれていたらどうなるでしょうか? クラスにないため、そのビットを逆シリアル化することはできません。

基本的に、クラスは XML を模倣する必要があります。次のようなものが必要です。

class Root
{
    Company Company { get; set; }
    List<Model> ModelList { get; set; }
}

class Company
{
    string Location { get; set; }
    string Name { get; set; }
}

class Model
{
    string Name { get; set; }
    int Value { get; set; }
}

次に、次のようにしてモデルを参照できます。

// Get the value for Chevy:
root.ModelList.Find(model => model.Name == "Chevy").Value;

編集:これを行うために必要なすべてのコードを貼り付けたものを次に示します: http://pastebin.com/Z3b3558Z。インデントについて申し訳ありませんが、VisualStudio は少し興奮しました。

于 2012-05-29T23:10:41.783 に答える