【问题标题】:Deserialzing Xml into List<T> with C#使用 C# 将 Xml 反序列化为 List<T>
【发布时间】:2016-04-22 23:07:16
【问题描述】:

我无法将 xml 反序列化为包含列表的类。一切都在对象中构建良好,直到它到达列表。我已经阅读了这里的所有帖子并尝试了几乎所有方法,但似乎仍然很糟糕。

XML: ("text.xml")

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
   <id>123456</id>
      <messages>
         <message>
            <words>Hello</words>
         </message>
         <message>
            <words>world</words>
         </message>
      </messages>
</example>

代码:

 static void Main(string[] args) {
     try {
        XmlSerializer serializer = new XmlSerializer(typeof(Example));


        XmlDocument objDoc = new XmlDocument();
        objDoc.Load("test.xml");

        XmlReader reader = XmlReader.Create(new StringReader(objDoc.OuterXml));

        Example example;

        example = (Example)serializer.Deserialize(reader);
        Console.WriteLine(example.Id.ToString());
        Console.WriteLine(example.Messages.Count.ToString());
        Console.WriteLine(example.Messages[0].Words);
     }
     catch(Exception ex) {
        Console.Write(ex.Message);
     }
     Console.ReadLine();

  }

  [XmlRoot("example")]
  public class Example {
     [XmlElement("id")]
     public int Id {
        get {
           return id;
        }
        set {
           id = value;
        }
     }
     private int id;

     [XmlElement("messages")]
     public List<Message> Messages {
        get {
           return messages;
        }
        set {
           messages = value;
        }
     }
     private List<Message> messages;
  }

  [XmlRoot("message")]
  public class Message {
     [XmlElement("words")]
     public string Words {
        get {
           return words;
        }
        set {
           words = value;
        }
     }
     private string words;
  }

输出:

123456

1

我是否缺少序列化程序需要的标记?或者我想要完成的事情是不可能的?非常感谢任何指向正确方向的指针或推动。

【问题讨论】:

    标签: c# xml deserialization


    【解决方案1】:

    试试这个:

    注意 XmlArray 和 XmlArraItem 的定义。我相信其他人会有更好的方法,但这会让它发挥作用。此外,您应该使用 'using' 语句来处理 xml 阅读器。

    public class Program
    {
        public static void Main(string[] args)
        {
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Example));
    
                using (XmlReader reader = XmlReader.Create("test.xml"))
                {
    
                    Example example = (Example)serializer.Deserialize(reader);
                    Console.WriteLine(example.Id.ToString());
                    Console.WriteLine(example.Messages.Count.ToString());
                    Console.WriteLine(example.Messages[0].Words);
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }
            Console.ReadLine();
    
        }
    
        [XmlRoot("example")]
        public class Example
        {
            [XmlElement("id")]
            public int Id
            {
                get
                {
                    return id;
                }
                set
                {
                    id = value;
                }
            }
            private int id;
    
            [XmlArray("messages")]
            [XmlArrayItem("message", typeof(Message))]
            public List<Message> Messages
            {
                get
                {
                    return messages;
                }
                set
                {
                    messages = value;
                }
            }
            private List<Message> messages;
        }
    
        [XmlRoot("message")]
        public class Message
        {
            [XmlElement("words")]
            public string Words { get; set; }
        }
    

    【讨论】:

    • 完美!太感谢了。这听起来很熟悉,但由于某种原因找不到。
    【解决方案2】:

    我明白你为什么感到困惑。您的对象结构与您的 XML 不匹配。您有一个 messages 节点,并且该节点包含列表。所以结构真的是这样的:

    [XmlRoot("example")]
    public class Example
    {
         [XmlElement("id")]
         public int Id { get; set; }
    
         [XmlElement("messages")]
         public Messages Messages { get; set; }
    }
    
    public class Messages
    {
        [XmlElement("message")]
        public List<Message> Message { get; set; }
    }
    
    public class Message
    {
        [XmlElement("words")]
        public string Words { get; set; }
    }
    

    针对该结构运行代码可以获得正确的输出。

    【讨论】:

      【解决方案3】:

      试试这个

        [XmlRoot("example")]
        public class Example {
           [XmlElement("id")]
           public int Id { get; set;}
      
           [XmlElement("messages")]
           public Message messages {get; set;}
        }
        [XmlRoot("messages")]
        public class Messages {
           [XmlElement("message")]
           public List<Message> message { get; set;}
      
        }
        [XmlRoot("message")]
        public class Message {
           [XmlElement("words")]
           public string Words { get; set;}
      
        }​
      

      【讨论】:

        猜你喜欢
        • 2011-09-28
        • 2012-04-06
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2020-10-16
        • 1970-01-01
        相关资源
        最近更新 更多