4

私のプログラムの仕事の 1 つは、xml ファイルから顧客リストを読み取り、以下のように C# クラスに逆シリアル化することです。

<?xml version="1.0" encoding="utf-8"?>
<customers>
    <customer>
        <name>john</name>
        <id>1</id>
    </customer>
    <customer>
        <name>mike</name>
        <id>2</id>
    </customer>
</customers>

C# クラス:

[XmlRoot("customers")]
public class CustomerList {
        [XmlElement("customer")]
        public Customer[] Customers { get; set; }
}

public class Customer {
    [XmlElement("name")]
    public String Name {get; set;}

    [XmlElement("id")]
    public String Id {get; set;}
}

<id>しかし最近、顧客はタグ名を次のように変更したいと考えてい<code>ます。

<?xml version="1.0" encoding="utf-8"?>
<customers>
    <customer>
        <name>john</name>
        <code>1</code>
    </customer>
    <customer>
        <name>mike</name>
        <code>2</code>
    </customer>
</customers>

「code」の値は、前のタグ「id」と同じ意味になります。そして、移行中にプログラムを修正して、一定期間両方のタグを認識できるようにすることを望んでいます。

それを達成する簡単な方法はありますか?ありがとう。

4

2 に答える 2

4

1 つのプライベート フィールドを使用し、2 つの異なるゲッター/セッターを使用しないのはなぜですか? 両方のタグが XML に表示されない限り、これは機能します。

[XmlRoot("customers")]
public class CustomerList {
    [XmlElement("customer")]
    public Customer[] Customers { get; set; }
}

public class Customer {
    private String _id;

    [XmlElement("name")]
    public String Name {get; set;}

    [XmlElement("id")]
    public String Id {get{return _id;} set{_id = value;}}

    [XmlElement("code")]
    public String Code {get{return _id;} set{_id = value;}}
}
于 2013-03-15T05:25:08.573 に答える
0

私の知る限り、XML 属性ではそれを行うことはできません。IXmlSerializable逆シリアル化プロセスを自分で実装して制御する必要があります。開始するためのいくつかのリンクを次に示します。

http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-正しく

IXmlSerializable を実装する適切な方法は?

私はそれを試していませんが、次のようなことをする必要があるようです:

public void ReadXml(XmlReader reader)
{
    var nodeType = reader.MoveToContent();
    if (nodeType == XmlNodeType.Element)
    {
        switch (reader.LocalName)
        {
            case "id":
            case "code": ID = int.Parse(reader.Value); break;
            default: break;
        }
    }
}

上記にはおそらくいくつかのタイプミスがありますが、それが一般的な考え方だと思います。

于 2013-03-15T05:20:19.120 に答える