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

时间:2011-07-15 17:38:50

标签: c# .net xml-serialization

我是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的空白类)

我希望能够将任何Group或Text实例推送到内容列表中。但是,当反序列化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结构以使问题更加清晰。

2 个答案:

答案 0 :(得分:3)

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

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

其他说明:

  • 您不需要[Serializable]
  • 一般不建议使用公共字段 - 首选属性
  • IMO列表会比这里的数组更好

答案 1 :(得分:0)

鉴于您可能在Page下有多个相同类型的节点,这应该有用。

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