首页 > 解决方案 > 使用 yield 返回 IEnumerable 时将 XML 反序列化为 C# 对象

问题描述

当我尝试对 XML 文件进行反序列化时出现此错误 XML 文档 (1、2) 中存在错误。

我在 webn 上搜索了几种解决方案,但都不起作用。

//The XML
<?xml version="1.0" encoding="utf-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <book>
    <bookid>9d6378e5-e01d-454d-bae5-52d9a6331f2e</bookid>
    <updatedate>2008-04-25</updatedate>
  </book>
</books>

public class MyBook
{
    public string BookId { get; set; }
    public DateTime UpdateDate { get; set; }
}

//I read the file, working
public IEnumerable<XElement> XElements()
{
    using (XmlReader reader = XmlReader.Create(this._filePath))
    {
        reader.MoveToContent();

        while (reader.Read())
        {
            if (reader.Name == "book")
            {
                XElement element = XElement.ReadFrom(reader) as XElement;
                if (element != null)
                    yield return element;
            }
        }
    }
}

//When I try to Deserialize that's crash
[TestMethod]
public void ReadXmlTest()
{
    ReadXmlFile readXmlFile = new ReadXmlFile(thepath);
    IEnumerable<XElement> xElements = readXmlFile.XElements();

    foreach (XElement e in xElements)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(MyBook));
        using (StringReader myStream = new StringReader(e.ToString()))
        {
            MyBook res = (MyBook)serializer.Deserialize(myStream);
        }

        //I gtried this solution too
        //XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyBook));
        //MyBook myBook = (MyBook)xmlSerializer.Deserialize(e.CreateReader());
    }
} 

标签: c#.netxmldeserialization

解决方案


你的类模型应该是这样的

[XmlRoot("book")]
public class MyBook
{
    [XmlElement("bookid")]
    public string BookId { get; set; }
    [XmlElement("updatedate")]
    public DateTime UpdateDate { get; set; }
}

因为 xml 元素的名称与类和属性的名称不匹配。


推荐阅读