繁体   English   中英

列表中的XML反序列化

[英]XML Deserialization in List

好的,我有一个Xml文件,像这样:

<?xml version="1.0" encoding="utf-8" ?>
<Books>
   <Book>
     <Name>book name</Name>
     <Url>book url</Url>
     <Genre>book genre</Genre>
     <City>book city</City>
     <Country>book country</Country>
   </Book>
   <Book>
     <Name>book name</Name>
     <Url>book url</Url>
     <Genre>book genre</Genre>
     <City>book city</City>
     <Country>book country</Country>
   </Book>
   <Book>
     <Name>book name</Name>
     <Url>book url</Url>
     <Genre>book genre</Genre>
     <City>book city</City>
     <Country>book country</Country>
   </Book>
</Books>

而且我想使用Deserialization来用书填充List 我有一个这样的课:

[Serializable]
public class Book
{
    public string Name{get; set;}
    public string Url { get; set; }
    public string Genre { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

像这样的List

List<Book> BookList;

我尝试像这样从xml文件读取:

XmlSerializer serializer = new XmlSerializer(typeof(Book));
FileStream fs = new FileStream(@"Book.xml", FileMode.Open);

using (XmlReader reader = XmlReader.Create(fs))
{
   BookList.Add((Book)serializer.Deserialize(reader));
   reader.Close();
}

但是,每当我运行我的应用程序时,我都会在Xml文件中收到错误消息。 如果我将我的xml文件更改为:

<Book>
   <Name>book name</Name>
   <Url>book url</Url>
   <Genre>book genre</Genre>
   <City>book city</City>
   <Country>book country</Country>
</Book>

一切都很好,希望我只读一本书。 我想做的是读大约100本书。 有任何想法吗?

如果您稍稍更改反序列化代码,它将起作用。

(请参阅XmlRootAttribute的用法,并输入Book[]

XmlSerializer serializer = new XmlSerializer(typeof(Book[]),new XmlRootAttribute("Books"));
FileStream fs = new FileStream(@"Book.xml", FileMode.Open);

using (XmlReader reader = XmlReader.Create(fs))
{
    var books = (Book[])serializer.Deserialize(reader);
}

顺便说一句:您不需要Serializable属性,仅由BinaryFormatter使用

PS:您也可以使用List<Book>类型代替Book[]

编辑

在修改代码多一点之后,它可以很简单:

XmlSerializer serializer = new XmlSerializer(typeof(List<Book>),
                                              new XmlRootAttribute("Books"));

using (FileStream fs = new FileStream(@"Book.xml", FileMode.Open))
{
    List<Book> books = (List<Book>)serializer.Deserialize(fs);
}

您需要创建一个包含书籍列表和此类的类的类:

[Serializable]
public class BookData
{
  [XmlArray(ElementName="Books")]
  [XmlArrayItem(ElementName="Book")]
  public List<Book> Books {get; set;}

}

然后像这样创建序列化器:

var serializer = new XmlSerializer(typeof(BookData));

我们可以从XmlDataDocument读取文件,而不是从FileStream加载,而book元素的迭代将使我们更轻松地进行序列化。 请看一下修改后的方法。

List<Book> BookList = new List<Book>();

            XmlDataDocument objDocument = new XmlDataDocument();
            objDocument.Load(@"Book.xml");


            XmlSerializer serializer = new XmlSerializer(typeof(Book));                

            foreach(XmlNode objItem in   objDocument.DocumentElement.ChildNodes)
            {
                TextReader objTextReader = new StringReader(objItem.OuterXml);

                using (XmlReader reader = XmlReader.Create(objTextReader))
                    {
                        BookList.Add((Book)serializer.Deserialize(reader));
                        reader.Close();
                    }
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM