4

我的程序的一项工作是从 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

为什么不使用一个私有字段并使用两个不同的 getter/setter?只要这两个标签都没有出现在 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-Correctly

实现 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 回答