8

我正在尝试将 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; }
    }

文档对象

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

        [XmlElement("valB")]
        public string ValB { get; set; }
    }

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>

反序列化代码

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);
}
4

2 回答 2

10

您已经用它们装饰了您的属性,XMLAttribute但它们是您的 XML 中的元素。因此,将所有更改XMLAttributeXmlElement.

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

此外,您的 XML 格式不正确。我想这是错字 -

<company_name>Apple</company_id>
<company_name>Microsoft</company_id>

结束标签应该是company_name-

<company_name>Apple</company_name>
<company_name>Microsoft</company_name>
于 2013-09-18T17:52:45.200 回答
4

我会使用 xml 解析器..

XDocument doc=XDocument.Load(url);
File[] r=doc.Elements("file")
            .Select(f=>
             new File
             {
                  Id=f.Element("id").Value,
                  Company_Id=f.Element("company_name").Value,
                  Docs=new HashSet<Docs>(
                       f.Elements("docs")
                        .Elements("doc")
                        .Select(d=>
                              new Doc
                              {
                                   ValA=d.Element("valA").Value,
                                   ValB=d.Element("valB").Value
                              }))
                }).ToArray();
于 2013-09-18T17:57:33.990 回答