Десериализация XML-массива в корне документа - PullRequest
8 голосов
/ 29 января 2011

Еще один вопрос о сериализации XML с .Net.

Я получаю строку XML от третьего лица и хочу разобрать ее в класс .Net с минимумом суеты.Я не хочу использовать xsd, так как мой XML довольно прост, и мне не нравятся подробные классы, которые он выплевывает.У меня есть основы работы десериализации, но я борюсь с массивом корневого уровня.

Проблема XML заключается в следующем:

<people>
  <person>
    <id>1234</id>
  </person>
  <person>
    <id>4567</id>
  </person>
 </people>

Как мне сопоставить атрибуты на моем C #Люди учатся десериализовать его?

Это то, что я хотел бы работать, но это не так.

[Serializable()]
[XmlRootAttribute("people", Namespace = "", IsNullable = false)]
public class People
{
    [XmlArrayItem(typeof(Person), ElementName = "person")]
    public List<Person> Persons;
}

Если я искажу XML в:

<result>
  <people>
    <person>
      <id>1234</id>
    </person>
    <person>
      <id>4567</id>
    </person>
   </people>
 </result>

Тогда он работает с приведенным ниже определением класса, но выглядит очень неправильно.

[Serializable()]
[XmlRootAttribute("result", Namespace = "", IsNullable = false)]
public class People
{
    [XmlArray(ElementName = "people")]
    [XmlArrayItem(typeof(Person), ElementName = "person")]
    public List<Person> Persons;
}

1 Ответ

9 голосов
/ 29 января 2011
[XmlElement("person")]
public List<Person> Persons;

хотя на самом деле я предпочитаю:

private List<Person> persons;
[XmlElement("person")]
public List<Person> Persons {get{return persons??(persons=new List<Person>());}}

, поскольку это имеет:

  • создание отложенного списка, когда вам не нужны люди
  • нет "set" в свойстве списка (оно не нужно)
...