![](/img/trans.png)
[英]Deserialize different xml elements with same name into different C# classes
[英]XML deserialize: different xml schema maps to the same C# class
我的程序的一个工作是从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”具有相同的含义。 他们希望在转换过程中修改程序,以便在一段时间内识别这两个标记。
有没有简单的方法来实现这一目标? 谢谢。
为什么不使用一个私有字段并使用两个不同的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;}}
}
据我所知,你不能用XML属性做到这一点。 您必须实现IXmlSerializable
并自己控制反序列化过程。 以下是一些可以帮助您入门的链接:
http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly
我没有尝试过,但似乎你需要做这样的事情:
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;
}
}
}
上面可能有一些拼写错误,但我认为这是一般的想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.