【问题标题】:XML Deserialization : from xmlString to complex classXML反序列化:从xmlString到复杂类
【发布时间】:2024-01-07 05:02:01
【问题描述】:

这是我从数据库中得到的 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 字符串反序列化到类对象 - 库中。目前我正在使用以下代码,但出现错误:

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

我得到的错误是:

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

【问题讨论】:

  • 考虑发布RequestXml 的实际值,而不是您认为的值。
  • 发布完整的例外情况
  • 您的示例对我来说按原样工作。我所要做的就是更改您的属性的外壳并将它们公开并完美地反序列化。
  • 当然,这假设您的 XML 中额外的 ">" 字符是人工制品,而不是实际文本的一部分......因为如果它们是,那么,我想你已经找到了你的问题.
  • 当我尝试将所有变量更改为公共时。这工作正常。虽然,反序列化不会填充 myTest 中的值。

标签: c# .net xml class deserialization


【解决方案1】:

查看这篇文章。您可以自动生成所需的一切,因此您不必手动编写代码并犯错误。

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

【讨论】:

  • 我手工编码的原因是因为我不想要一个数组......当我使用 xsd 时,它会自动将我的 List 作为一个数组。
【解决方案2】:

我的新班级看起来像这样,并且像魅力一样工作:

 [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; }
    }

【讨论】:

    【解决方案3】:

    关于你在问题中的 cmets。

    基本上我无法获得 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

    【讨论】:

    • 注意,DataType = "integer" DataType = "int" 在 msdn 链接的备注部分。我看到的问题是你的 xml sn-p 有 01.. 我不确定你是否应该解析..
    • 非常感谢。这帮助我解决了问题。