【问题标题】:How to deserialize xml to object [duplicate]如何将xml反序列化为对象[重复]
【发布时间】:2024-01-05 11:44:01
【问题描述】:
<StepList>
  <Step>
    <Name>Name1</Name>
    <Desc>Desc1</Desc>
  </Step>
  <Step>
    <Name>Name2</Name>
    <Desc>Desc2</Desc>
  </Step>
</StepList>

我有这个 XML, 我应该如何对 Class 进行建模以便能够使用 XmlSerializer 对象对其进行反序列化?

【问题讨论】:

    标签: c# xml-deserialization


    【解决方案1】:

    上面的cmets是正确的。你缺少装饰器。 如果你想要一个通用的反序列化器,你可以使用它。

    public static T DeserializeXMLFileToObject<T>(string XmlFilename)
    {
        T returnObject = default(T);
        if (string.IsNullOrEmpty(XmlFilename)) return default(T);
    
        try
        {
            StreamReader xmlStream = new StreamReader(XmlFilename);
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            returnObject = (T)serializer.Deserialize(xmlStream);
        }
        catch (Exception ex)
        {
            ExceptionLogger.WriteExceptionToConsole(ex, DateTime.Now);
        }
        return returnObject;
    }
    

    那么你可以这样称呼它:

    MyObjType MyObj = DeserializeXMLFileToObject<MyObjType>(FilePath);
    

    【讨论】:

      【解决方案2】:

      你的类应该是这样的

      [XmlRoot("StepList")]
      public class StepList
      {
          [XmlElement("Step")]
          public List<Step> Steps { get; set; }
      }
      
      public class Step
      {
          [XmlElement("Name")]
          public string Name { get; set; }
          [XmlElement("Desc")]
          public string Desc { get; set; }
      }
      

      这是我的测试代码。

      string testData = @"<StepList>
                              <Step>
                                  <Name>Name1</Name>
                                  <Desc>Desc1</Desc>
                              </Step>
                              <Step>
                                  <Name>Name2</Name>
                                  <Desc>Desc2</Desc>
                              </Step>
                          </StepList>";
      
      XmlSerializer serializer = new XmlSerializer(typeof(StepList));
      using (TextReader reader = new StringReader(testData))
      {
          StepList result = (StepList) serializer.Deserialize(reader);
      }
      

      如果您想读取文本文件,您应该将文件加载到 FileStream 并反序列化它。

      using (FileStream fileStream = new FileStream("<PathToYourFile>", FileMode.Open)) 
      {
          StepList result = (StepList) serializer.Deserialize(fileStream);
      }
      

      【讨论】:

      • [XmlElement("Step")] 是关键 - 删除 XML 中的“step”嵌套 (...)
      • 我不明白。当然[XmlElement("Step")] 是关键,是对的。 “- 删除 XML 中的“步骤”嵌套 (...)”是什么意思。谢谢!
      • 它不适合您,而是适合可能正在阅读此答案的其他人:) 如果您没有 [XmlElement] 则生成的 XML 将是这样的:Name1 Name2。我花了一段时间才弄清楚如何删除外部 块。
      • 我在课堂上尝试不使用 [XmlElement("Step")] 并且它正在工作
      • @suchoss 是的,使用“使用”有很多好处。 *.com/a/26741192/466577