是否可以在不使用 linq-to-xml 的情况下将 xml 反序列化为字典?

问题描述 投票:0回答:1

我想反序列化 xml 文件。这是有问题的 xml 文件:

<MessageList category="Alarm" version="1.0.0">
    <Item id="1">
        <Message key="Level" text="Alarm" />
        <Message key="Title" text="ERROR AT PLC UNIT" />
        <Message key="Detail" text="Change PLC unit. &#xD;&#xA;If it is out of order. please contact our service man." />
    </Item>
    <Item id="2">
        <Message key="Level" text="Alarm" />
        <Message key="Title" text="RE-SET PLC UNIT ( PROGRAM FS )" />
        <Message key="Detail" text="Turn off and restart. if the problem persists. check thet the switch on the controller is in RUN mode. &#xD;&#xA;If it is out of order. please contact our service man." />
    </Item>
    <Item id="3">
        <Message key="Level" text="Alarm" />
        <Message key="Title" text="" />
        <Message key="Detail" text="" />
    </Item>
    <Item id="4">
        <Message key="Level" text="Alarm" />
        <Message key="Title" text="" />
        <Message key="Detail" text="" />
    </Item>
    <Item id="5">
        <Message key="Level" text="Alarm" />
        <Message key="Title" text="" />
        <Message key="Detail" text="" />
    </Item>

是否可以在不使用 linq-to-xml 的情况下将 xml 反序列化为字典? 你好,我想反序列化一个 xml 文件。这是有问题的 xml 文件 我想获得如下所示的两个课程。链接到 MessageList 的类,其中包含所有其他 Items 元素。 您可能已经注意到,所有项目都有一个代表它们的唯一 ID。所以我想将它用作字典键并将消息元素包含在列表中作为字典值。

class MessageListClass
{
    public string category { get; set; }
    public string version { get; set; }
    public List< Dictionary<int, List<Message> > > items { get; set; }
}
public class Message
{
    public string key { get; set; }
    public string text { get; set; }
}

目前,我已经使用 System.Xml.Serialization 中的属性以这种方式完成了。它运作良好,但它们不是字典。有没有办法使用 System.Xml.Serialization 属性而不是 Linq-to-Xml 来获取像我想要的字典?

[XmlRoot("MessageList")]
    class MessageList
    {
        [XmlAttribute("category")]
        public string category { get; set; }
        [XmlAttribute("version")]
        public string version { get; set; }
        [XmlElement("Item")]
        public List<Item> items { get; set; }
    }
    public class Item
    {
        [XmlAttribute("id")]
        public int alarmId { get; set; }
        [XmlElement("Message")]
        public List<Message> messages { get; set; }
    }
    public class Message
    {
        [XmlAttribute("key")]
        public string key { get; set; }
        [XmlAttribute("text")]
        public string text { get; set; }
    }
c# xml xml-deserialization
1个回答
0
投票

我建议为序列化和其他用途保留单独的模型。这对于模型不完全匹配的情况很有帮助。专用于序列化的类有时称为“数据传输对象”或“DTO”。

您可以添加一种方法以从一种模型转换为另一种模型:

class MessageListDTO
{
   [XmlAttribute("category")]
   public string Category { get; set; }
   [XmlAttribute("version")]
   public string Version { get; set; }
   [XmlElement("Item")]
   public List<ItemDTO> Items { get; set; }

   public MessageList ToModel(){
       return new MessageList(){
          Category = Category,
          Version = Version,
          Items = Items.ToDictionary(
                    i => i.AlarmId ,
                    i =>  i.Messages.Select(m => m.ToModel()).ToList())
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.