将XML反序列化为对象数组

Jam*_*son 9 c# xml serialization

我正在尝试将XML文件反序列化为对象数组,但我收到的是空对象.我的问题看起来类似于:如何将xml反序列化为对象数组?但我似乎无法创建一个继承IXmlSerializable的类.也就是说,我不认为这种方法是必要的.

难道我做错了什么?

文件对象

 [XmlType("file")]
    public class File
    {
        [XmlElement("id")]
        public string Id { get; set; }

        [XmlElement("company_name")]
        public string Company_Name { get; set; }

        [XmlElement("docs")]
        public HashSet<doc> Docs { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

Doc对象

 [XmlType("doc")]
    public class Doc
    {
        [XmlElement("valA")]
        public string ValA { get; set; }

        [XmlElement("valB")]
        public string ValB { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

XML

<?xml version="1.0" encoding="UTF-8"?>
  <files>
    <file>
      <id>12345</id>
      <company_name>Apple</company_name>
      <docs>
       <doc>
          <valA>Info</valA>
          <valB>More Info</valB>
       </doc>  
      </docs>
    </file>
    <file>
      <id>12345</id>
      <company_name>Microsoft</company_name>
      <docs>
       <doc>
          <valA>Even More Info</valA>
          <valB>Lots of it</valB>
       </doc>  
      </docs>
    </file>
  </files>
Run Code Online (Sandbox Code Playgroud)

反序列化代码

XmlSerializer mySerializer = new XmlSerializer(typeof(File[]), new XmlRootAttribute("files"));
using (FileStream myFileStream = new FileStream("Files.xml", FileMode.Open))
{
    File[] r;
    r = (File[])mySerializer.Deserialize(myFileStream);
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ats 11

您已使用属性修饰了属性,XMLAttribute但它们是XML中的元素.所以,全部XMLAttribute改为XmlElement.

[XmlType("file")]
public class File
{
    [XmlElement("id")]
    public string Id { get; set; }

    [XmlElement("company_name")]
    public string Company_Id { get; set; }

    [XmlArray("docs")]
    public HashSet<Doc> Docs { get; set; }
}

[XmlType("doc")]
public class Doc
{
    [XmlElement("valA")]
    public string ValA { get; set; }

    [XmlElement("valB")]
    public string ValB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你的XML也不是很好.我猜这是错误的 -

<company_name>Apple</company_id>
<company_name>Microsoft</company_id>
Run Code Online (Sandbox Code Playgroud)

结尾标记应为company_name-

<company_name>Apple</company_name>
<company_name>Microsoft</company_name>
Run Code Online (Sandbox Code Playgroud)