2013-09-18 3 views
8

Я пытаюсь десериализовать XML-файл в массив объектов, но я получаю пустые объекты. Мой вопрос выглядит примерно так: How to Deserialize xml to an array of objects?, но я не могу создать класс, который наследует IXmlSerializable. Тем не менее, я не думаю, что этот подход необходим.Deserialize XML to Object Array

Я что-то не так?

Object File

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

Doc Object

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

ответ

10

Вы украсили свои свойства с 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> 
+0

Я попытался изменить его к элементу, по-прежнему возвращает пустой массив. Да, просто опечатка для конечного тега. –

+0

Я пробовал это, и это сработало отлично для меня. Также 'public HashSet Документы {get; задавать; } 'должно быть' public HashSet Docs {get; задавать; } ' –

+0

' Id' и 'Company_Id' являются ли они также нулевыми? –

4

Я хотел бы использовать XML Parser ..

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();