C# 列表中的XML反序列化
好的,我有一个如下的Xml文件:C# 列表中的XML反序列化,c#,list,deserialization,C#,List,Deserialization,好的,我有一个如下的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&g
<?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>
List<Book> BookList;
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();
}
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();
}
}
还有这样一个列表
:
<?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>
List<Book> BookList;
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();
}
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();
}
}
但每当我运行应用程序时,Xml文件中就会出现错误。如果我将xml文件更改为:
<Book>
<Name>book name</Name>
<Url>book url</Url>
<Genre>book genre</Genre>
<City>book city</City>
<Country>book country</Country>
</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();
}
}
书名
图书网址
图书类型
书城
图书国
一切顺利,我只看了一本书。我想做的是读大约100本书。有什么想法吗?您需要创建一个类,该类将包含一个书籍和系列的列表:
[Serializable]
public class BookData
{
[XmlArray(ElementName="Books")]
[XmlArrayItem(ElementName="Book")]
public List<Book> Books {get; set;}
}
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();
}
}
您需要创建一个类,该类将包含该类的书籍和系列的列表:
[Serializable]
public class BookData
{
[XmlArray(ElementName="Books")]
[XmlArrayItem(ElementName="Book")]
public List<Book> Books {get; set;}
}
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();
}
}
如果您稍微更改一下反序列化代码,它就会工作
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();
}
}
(请参阅XmlRootAttribute
的用法和键入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();
}
}
顺便说一句:您不需要Serializable
属性,它只供
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();
}
}
PS:您也可以使用类型列表
而不是书籍[]
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);
}
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();
}
}
编辑
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();
}
}
在稍微修改您的代码后,可以简单地执行以下操作:
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);
}
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();
}
}
XmlSerializer serializer=新的XmlSerializer(typeof(List),
新的XmlRootAttribute(“图书”);
使用(FileStream fs=newfilestream(@“Book.xml”,FileMode.Open))
{
List books=(List)序列化程序。反序列化(fs);
}
如果您稍微更改一下反序列化代码,它就会工作
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();
}
}
(请参阅XmlRootAttribute
的用法和键入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();
}
}
顺便说一句:您不需要Serializable
属性,它只供
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();
}
}
PS:您也可以使用类型列表
而不是书籍[]
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);
}
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();
}
}
编辑
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();
}
}
在稍微修改您的代码后,可以简单地执行以下操作:
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);
}
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();
}
}
XmlSerializer serializer=新的XmlSerializer(typeof(List),
新的XmlRootAttribute(“图书”);
使用(FileStream fs=newfilestream(@“Book.xml”,FileMode.Open))
{
List books=(List)序列化程序。反序列化(fs);
}
而不是从FileStream
加载,我们可以从XmlDataDocument
中读取,而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();
}
}
List BookList=新列表();
XmlDataDocument objDocument=新的XmlDataDocument();
Load(@“Book.xml”);
XmlSerializer serializer=新的XmlSerializer(typeof(Book));
foreach(objDocument.DocumentElement.ChildNodes中的XmlNode对象)
{
TextReader objTextReader=新的StringReader(objItem.OuterXml);
使用(XmlReader=XmlReader.Create(objTextReader))
{
BookList.Add((Book)序列化程序.反序列化(reader));
reader.Close();
}
}
而不是从FileStream
加载,我们可以从XmlDataDocument
中读取,而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();
}
}
List BookList=新列表();
XmlDataDocument objDocument=新的XmlDataDocument();
Load(@“Book.xml”);
XmlSerializer serializer=新的XmlSerializer(typeof(Book));
foreach(objDocument.DocumentElement.ChildNodes中的XmlNode对象)
{
TextReader objTextReader=新的StringReader(objItem.OuterXml);
使用(XmlReader=XmlReader.Create(objTextReader))
{
BookList.Add((Book)序列化程序.反序列化(reader));
reader.Close();
}
}
值得一提的是,@I4V的代码还修复了OP由于reader.Close()而进一步遇到的问题指令。值得一提的是@I4V的代码还修复了OP会遇到的问题,因为reader.Close()代码>使用语句内部的指令。