В C # как я могу десериализовать XML-документ, содержащий список элементов без окружающего элемента списка - PullRequest
6 голосов
/ 06 января 2010

Надеюсь, вопрос с очень простым ответом, но я не смог его найти. У меня есть небольшой XML-документ, который выглядит примерно так:

<aa>
  <bb><name>bb1</name></bb>
  <bb><name>bb2</name></bb>
  <bb><name>bb3</name></bb>
</aa>

У меня есть классы, которые представляют aa и bb

[XmlRoot("aa")]
public class aa
{
  [XmlArray("bbs")]
  [XmlArrayItem("bb")]
  public bb[] bbs;
}

public class bb
{
  [XmlElement("name")]
  public string Name;
}

Когда я пытаюсь десериализовать документ с помощью XmlSerializer, я получаю объект aa со свойством null bbs. Насколько я понимаю, это связано с тем, что атрибуты, которые я использовал в свойстве bbs, говорят сериализатору ожидать такой документ:

<aa>
  <bbs>
    <bb><name>bb1</name></bb>
    <bb><name>bb2</name></bb>
    <bb><name>bb3</name></bb>
  </bbs>
</aa>

Учитывая, что я не могу изменить формат получаемого XML, есть ли способ сообщить XmlSerialiser, что он должен ожидать массив, не заключенный в другой тег?

Ответы [ 2 ]

8 голосов
/ 06 января 2010

Попробуйте заменить атрибуты [XmlArray("bbs")] и [XmlArrayItem("bb")] одним атрибутом [XmlElement]

[XmlRoot("aa")]
public class aa
{
  [XmlElement("bb")]
  public bb[] bbs;
}

public class bb
{
  [XmlElement("name")]
  public string Name;
}

Вставляя атрибуты Array и ArrayItem, вы явно описывали, как сериализовать это как массив с контейнером для переноса.

4 голосов
/ 06 января 2010

Измените [XmlArray] / [XmlArrayItem] на [XmlElement], что говорит сериализатору, что у элементов нет обертки, например,

[XmlRoot("aa")]
public class aa
{
  [XmlElement("bb")]
  public bb[] bbs;
}

public class bb
{
  [XmlElement("name")]
  public string Name;
}
...