XML反序列化:从xmlString到复杂类

时间:2015-01-16 17:51:43

标签: c# .net xml class deserialization

这是我从数据库中得到的xml:

> <Library>
>     <Header>
>         <HeaderID>01</HeaderID>
>     </Header>
>     <Books>
>         <Book>
>             <Name>Book1</Name>
>             <Category>Fiction</Category>
>             <Authors>2</Authors>
>         </Book>
>         <Book>
>             <Name>Book2</Name>
>             <Category>Non - Fiction</Category>
>             <Authors>1</Authors>
>         </Book>
>      </Books>
>      <Authors>
>           <Author>
>               <Name>Author1ForBook1</Name>
>           </Author>
>           <Author>
>               <Name>Author2ForBook1</Name>
>           </Author>
>           <Author>
>               <Name>Author1ForBook2</Name>
>           </Author>
>       </Authors> 
></Library>

这是我的班级:

public class Library
{
   public Header header{get; set;}
   public List<Book> books{get;set;}
   public List<Author> authors{get;set;}
}

public class Header
{
   int ID{get;set;}
}

public class Book
{
  string Name{get; set;}
  string Category{get; set;}
  string Fiction{get; set;}
}

public class Author
{
  string Name{get;set;}
}

我希望能够将从数据库中获取的xml字符串反序列化为类对象 - Library。目前我正在使用以下代码,但是我收到一个错误:

String xData = RequestXml;
XmlSerializer x = new XmlSerializer(typeof(Library));
Library myTest = (Library)x.Deserialize(new StringReader(xData));

我得到的错误是:

XML文档(1,2)中存在错误。

3 个答案:

答案 0 :(得分:1)

查看这篇文章。您可以自动生成所需的一切,因此您无需手动编码并制造错误。

http://blogs.msdn.com/b/yojoshi/archive/2011/05/14/xml-serialization-and-deserialization-entity-classes-with-xsd-exe.aspx

答案 1 :(得分:1)

我的新课程看起来像这样,就像一个魅力:

 [XmlRoot("Library")]
    public class Library
    {
         [XmlElement("Header")]
        public Header header { get; set; }
         [XmlElement("Book")]
        public List<Book> books { get; set; }
         [XmlElement("Author")]
        public List<Author> authors { get; set; }
    }


    public class Header
    {

        public int HeaderID { get; set; }
    }

    public class Book
    {
        public string Name { get; set; }
        public string Category { get; set; }
        public string Fiction { get; set; }
    }

    public class Author
    {
       public  string Name { get; set; }
    }

答案 2 :(得分:0)

关于你对问题的评论。

  

基本上我无法获得Library.Header.ID的值。我怎样才能实现它?

因为它是Library.Header.HeaderID而不是Library.Header.ID ..您的媒体资源名为ID ..

在您的媒体资源上使用和定义数据注释来映射元素

 using System.Xml.Serialization;

 public class Header
 {
   [XmlElement(DataType = "integer", ElementName = "HeaderID")]
   int ID{get;set;}
 }

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute(v=vs.110).aspx