【问题标题】:Deserialize XML to Object Array将 XML 反序列化为对象数组
【发布时间】:2013-09-18 17:38:20
【问题描述】:

我正在尝试将 XML 文件反序列化为对象数组,但我收到的是空对象。 我的问题与此类似:How to Deserialize xml to an array of objects? 但我似乎无法创建一个继承 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);
}

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    您已经用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; }
    }
    

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

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

    结束标签应该是company_name -

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

    【讨论】:

    • 我尝试将其更改为元素,仍然返回空白数组。是的,只是结束标签的错字。
    • 我试过了,对我来说效果很好。 public HashSet&lt;doc&gt; Docs { get; set; } 也应该是 public HashSet&lt;Doc&gt; Docs { get; set; }
    • IdCompany_Id 这些也是空的吗?
    • 啊,现在可以了。关键部分是属性-> 元素更改。还有一个错字。谢谢!
    【解决方案2】:

    我会使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2020-12-16
      • 2014-11-30
      • 1970-01-01
      相关资源
      最近更新 更多