2013-03-15 102 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