2015-10-14 79 views
0

我有一個客戶端接收到的XML,我需要將它串行化爲類結構。這裏是XML結構。將XML反序列化到具有屬性的類

<?xml version="1.0" encoding="utf-8"?> 
<MainData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<listofChannels> 
    <item type="DAY CHANNEL"> 
    <channelName>one</channelName> 
    <channelPort>11</channelPort> 
    <ServerDetail ipaddress="127.0.0.1" port="80"/> 
    </item> 
    <item type="NIGHT CHANNEL"> 
    <channelName>one</channelName> 
    <channelPort>11</channelPort> 
    <ServerDetail ipaddress="127.0.0.2" Port="80"/> 
</item> 
</listofChannels> 
</MainData> 

現在我試圖創建一個C#類來表示這個並獲得通道列表。所以我寫了這段代碼,但是我沒有得到這個列表,它是空白的。

MainData mainData = new MainData(); 
var serializer = new XmlSerializer(typeof(MainData)); 
using (TextReader reader = new StreamReader(dataFilePath)) // dataFilePath is the FilePath 
{ 
    mainData = (MainData)serializer.Deserialize(reader); 
} 

這裏是我的班

public class MainData 
{ 
    public List<Channel> listofChannels { get; set; } 
} 

public class Channel 
{ 
    public string Type; 
    [XmlAttribute("channelName")] 
    public string Name; 
    [XmlAttribute("channelPort")] 
    public int Port; 
    public ChannelDetail details; 
} 

public class ChannelDetail 
{ 
    [XmlAttribute("ipaddress")] 
    public string IPAddress { get; set; } 

    [XmlAttribute("port")] 
    public int Port { get; set; } 
} 
+0

我建議使用JSON序列化,它會有所幫助,因爲如果存在不安全的字符,XML序列化可能會導致問題,除非您計劃轉義字符串[link](https://msdn.microsoft.com/ EN-US /庫/ system.security.securityelement.escape(v = vs.110)的.aspx)。 – Darkestlyrics

回答

0

是應該填充通道類被命名爲「項目」的元素。由於它們不匹配,你必須手動指定它(同樣適用於ChannelDetail - ServerDetail)。

還有一些元素被映射到屬性。我改變了類定義如下,似乎是現在的工作罰款:

public class MainData 
{ 
    public List<Channel> listofChannels { get; set; } 
} 

[XmlType("item")] 
public class Channel 
{ 
    [XmlAttribute("type")] 
    public string Type; 

    [XmlElement("channelName")] 
    public string Name; 

    [XmlElement("channelPort")] 
    public int Port; 

    [XmlElement("ServerDetail")] 
    public ChannelDetail details; 
} 

public class ChannelDetail 
{ 
    [XmlAttribute("ipaddress")] 
    public string IPAddress { get; set; } 

    [XmlAttribute("port")] 
    public int Port { get; set; } 
} 

此外,在ServerDetail「端口」屬性中的問題樣品中拼寫不同。由於XML區分大小寫,因此必須確保它們都具有相同的套管,並使用XmlAttribute [「port」]或XmlAttribute [「Port」]將其映射到Port變量。

+0

XML中的端口只是一個錯字。實際上它是「端口」,你的解決方案工作正常 –