XML序列化——构建特定类型的子元素列表



我是c#的新手(第2天),所以如果我的术语有点不合适,我提前道歉。

考虑以下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文档被反序列化时,内容为空。我确实注意到,如果我按照以下方式构造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结构,如第一个示例所示。

实现这一目标的最佳方法是什么?

谢谢你的时间!

编辑

更新XML结构,使问题更清晰。

如果不想使用包装器元素,请使用XmlElement:

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

其他笔记:

  • 你不需要[Serializable]
  • 一般不建议使用
  • 公共字段—首选属性
  • 在我看来,列表比数组要好。

考虑到您可能在Page下有多个相同类型的节点,这应该可以工作。

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

相关内容

最新更新