将 XML 反序列化为具有属性的 class
Deserialise XML into class with attributes
我有一个 XML 被客户收到,我需要将它序列化为 class 结构。这是 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# class 来表示它并获取频道列表。所以我写了这段代码,但我没有得到这个列表,它是空白的。
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);
}
这是我的 classes
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; }
}
应该填充频道 class 的元素被命名为 "item"。由于它们不匹配,您必须手动指定它(同样适用于 ChannelDetail - ServerDetail)。
还有一些元素被映射到属性。我如下更改了 class 定义,现在似乎工作正常:
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 中的 "port" 属性在问题示例中的拼写不同。由于 XML 区分大小写,因此您必须确保它们都具有相同的大小写,并使用 XmlAttribute["port"] 或 XmlAttribute["Port"].[= 将其映射到 Port 变量11=]
我有一个 XML 被客户收到,我需要将它序列化为 class 结构。这是 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# class 来表示它并获取频道列表。所以我写了这段代码,但我没有得到这个列表,它是空白的。
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);
}
这是我的 classes
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; }
}
应该填充频道 class 的元素被命名为 "item"。由于它们不匹配,您必须手动指定它(同样适用于 ChannelDetail - ServerDetail)。
还有一些元素被映射到属性。我如下更改了 class 定义,现在似乎工作正常:
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 中的 "port" 属性在问题示例中的拼写不同。由于 XML 区分大小写,因此您必须确保它们都具有相同的大小写,并使用 XmlAttribute["port"] 或 XmlAttribute["Port"].[= 将其映射到 Port 变量11=]