Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中的XML反序列化_C#_List_Deserialization - Fatal编程技术网

C# 列表中的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文件:

<?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()使用语句内部的指令。