繁体   English   中英

将XML反序列化为具有属性的类

[英]Deserialise XML into class with attributes

客户收到了一种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; }
}

应该填充Channel类的元素称为“ item”。 由于它们不匹配,因此您必须手动指定它(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变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM