Десериализация XML и свободные элементы массива

Итак, я работаю с некоторыми файлами 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?


person David Morton    schedule 10.02.2009    source источник


Ответы (1)


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

[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

person Marc Gravell    schedule 10.02.2009
comment
Снова слишком сложно ... Спасибо. :) - person David Morton; 11.02.2009
comment
Предполагается, что XmlElements здесь читают, например, ArrayType1 или ArrayType1Collection? - person Dan Forbes; 20.05.2016
comment
Когда я смотрю второй фрагмент XML OP, я вижу XmlElement с именем ArrayType1Collection, который по сути является набором XmlElements типа ArrayType1. Когда я смотрю на ваш фрагмент кода, я вижу XmlElement с именем ArrayType1, который по сути является набором objects типа ArrayType1. Я ожидал, что имя XmlElement будет ArrayType1Collection (поскольку это имя элемента, который содержит дочерние элементы типа ArrayType1). - person Dan Forbes; 20.05.2016