2013-03-15 99 views
4

我的一个程序的工作是从一个XML文件中读取客户名单,并将其反序列化到C#类象下面这样:XML反序列化:不同的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'具有相同的含义。他们希望在转换过程中应该修改程序,以便在一段时间内识别两个标签。

有没有简单的方法来实现这一点?谢谢。

+0

+1:好问题! – Matt 2013-03-15 05:08:53

回答

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;}} 
} 
+0

你是对的..干得好!不幸的是它需要2个不同的属性..但它确实很好。好一个!为你+1! – Matt 2013-03-15 05:30:37

+0

@Matt谢谢。这是临时性问题的临时解决方案:) – mostruash 2013-03-15 05:32:23

+0

非常感谢!这确实解决了这个问题。 – yyou 2013-03-15 05:43:08

0

据我所知,你不能用XML属性来做到这一点。你将不得不实施IXmlSerializable并自己控制反序列化过程。这里有几个链接,让你开始:

http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly

Proper way to implement 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; 
     } 
    } 
} 

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

+0

谢谢你,马特。我会试一试。 – yyou 2013-03-15 05:44:34