[英]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.