XML-сериализация - создание списка дочерних элементов определенного типа - PullRequest
1 голос
/ 15 июля 2011

Я новичок (день 2) в c #, поэтому заранее прошу прощения, если моя терминология немного не подходит.

Рассмотрим следующие модели XML и классов:

<Page label="Page 1.1">
    <Group label="Group 1.1.1"></Group>
    <Group label="Group 1.1.2"></Group>
    <Text label="Text 1.1.1"></Text>
    <Text label="Text 1.1.2"></Text>
</Page>

public class AbstractElementModel
{
    [XmlAttributeAttribute()]
    public string label;
}

[Serializable]
public class Page:AbstractElementModel
{
    [XmlArrayItem(typeof(Group)),
     XmlArrayItem(typeof(Text))]
    public AbstractElementModel[] content;
}

(модели групп и текста не показаны, в данном примере это пустые классы, расширяющие AbstractElementModel)

Я хотел бы иметь возможность помещать любые экземпляры группы или текста в список содержимого.Тем не менее, когда XML-документ десериализован, содержимое имеет значение null.Я заметил, что это работает, если я структурирую XML следующим образом:

<Page label="Page 1.1">
    <content>
        <Group label="Group 1.1.1"></Group>
        <Group label="Group 1.1.2"></Group>
        <Text label="Text 1.1.1"></Text>
        <Text label="Text 1.1.2"></Text>
    </content>
</Page>

Однако мне нужно иметь возможность десерализовать структуру XML, как показано в первом примере.

Что такоелучший способ добиться этого?

Спасибо за ваше время!

edit

Обновлена ​​структура XML, чтобы сделать проблему яснее.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Используйте XmlElement , если вам не нужен элемент-обертка:

public class Page:AbstractElementModel
{
    [XmlElement("Group", typeof(Group))]
    [XmlElement("Text", typeof(Text))]
    public AbstractElementModel[] content;
}

другие заметки:

  • тебе не нужно [Serializable]
  • публичные поля, как правило, не рекомендуются - предпочтительнее свойство
  • ИМО список будет лучше, чем массив здесь
0 голосов
/ 15 июля 2011

Учитывая, что у вас может быть несколько узлов одного типа под Page, это должно работать.

[Serializable]
public class Page:AbstractElementModel
{
    [XmlArrayItem()]
    public Group[] Group;
    [XmlArrayItem()]
    public Text[] Text;
}
...