Десериализация XML и свободные элементы массива - PullRequest
3 голосов
/ 11 февраля 2009

Итак, я работаю с некоторыми XML-файлами, которые, по моему мнению, скорее всего, плохо сформированы, и я пытаюсь выяснить, как и если я могу использовать XmlSerializer для десериализации этого XML в логический бизнес-объект. Допустим, у меня есть следующий XML-файл:

<Root>
   <ArrayType1 Name="Bob"/>
   <ArrayType1 Name="Jim"/>
   <ArrayType2 Name="Frank">
      <SubItem Value="4"/>
   </ArrayType2>
   <ArrayType2 Name="Jimbo">
      <SubItem Value="2"/>
   </ArrayType2>
</Root>

Теперь я хотел бы создать класс, который имеет эти три типа, Root, ArrayType1 и ArrayType2, но я хотел бы получить два списка в Root, один из которых содержит коллекцию элементов ArrayType1, а другой - коллекцию Элементы ArrayType2, но кажется, что эти элементы должны иметь какой-то корень, например, я знаю, как просто отлично десериализовать следующее:

<Root>
   <ArrayType1Collection>
      <ArrayType1 Name="Bob"/>
      <ArrayType1 Name="Jim"/>
   </ArrayType1Collection>
   <ArrayType2Collection>
      <ArrayType2 Name="Frank">
         <SubItem Value="4"/>
      </ArrayType2>
      <ArrayType2 Name="Jimbo">
         <SubItem Value="2"/>
      </ArrayType2>
   </ArrayType2Collection>
</Root>

Но как бы я десериализовал это без родительских элементов ArrayType # Collection, окружающих элементы ArrayType #?

Сериализатор XML вообще это вообще допустит?

1 Ответ

11 голосов
/ 11 февраля 2009

Разве это не просто:

[Serializable]
public class Root {
    [XmlElement("ArrayType1")]
    public List<ArrayType1> ArrayType1 {get;set;}

    [XmlElement("ArrayType2")]
    public List<ArrayType2> ArrayType2 {get;set;}
}

В качестве альтернативы просто поместите xml в файл ("foo.xml") и используйте:

xsd foo.xml
xsd foo.xsd /classes

и посмотрите на сгенерированный foo.cs

...