如何将xml反序列化为对象[重复]

Posted

技术标签:

【中文标题】如何将xml反序列化为对象[重复]【英文标题】:How to deserialize xml to object [duplicate] 【发布时间】:2012-05-18 02:28:25 【问题描述】:
<StepList>
  <Step>
    <Name>Name1</Name>
    <Desc>Desc1</Desc>
  </Step>
  <Step>
    <Name>Name2</Name>
    <Desc>Desc2</Desc>
  </Step>
</StepList>

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

【问题讨论】:

【参考方案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

以上是关于如何将xml反序列化为对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象的json数组反序列化为字典[重复]

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

如何将 XML Choice 反序列化为正确的复杂类型

使用动态将 XML 反序列化为对象

XML 文档中存在错误 (0, 0) - 将 XML 反序列化为对象时出错