Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML反序列化:不同的XML模式映射到同一个C#类_C#_Xml_Xml Serialization - Fatal编程技术网

XML反序列化:不同的XML模式映射到同一个C#类

XML反序列化:不同的XML模式映射到同一个C#类,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我的程序的任务之一是从xml文件中读取客户列表,并将其反序列化到C类中,如下所示: <?xml version="1.0" encoding="utf-8"?> <customers> <customer> <name>john</name> <id>1</id> </customer> <customer> <

我的程序的任务之一是从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>
但最近客户希望将标签名称从
更改为
,如下所示:

<?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”具有相同的含义。他们希望在过渡期间,程序应该被修改,以便在一段时间内识别两个标签


有什么简单的方法可以做到这一点吗?谢谢。

据我所知,使用XML属性无法做到这一点。您必须实现
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;
        }
    }
}

上面可能有一些输入错误,但我认为这是一般的想法。

为什么不使用一个私有字段并使用两个不同的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;}}
}

你说得对。。做得好!不幸的是,它需要两个不同的属性。。但它确实很有效。不错1给你@马特,谢谢你。这是一个临时问题的临时解决方案:)@yyou单击答案旁边的绿色勾号将其标记为
已回答
。谢谢你,马特。我要试一试。
[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;}}
}