没有“父”数组标识符的

时间:2018-09-03 10:43:35

标签: c# xml xml-serialization

我尝试将xml序列化(读取)到我的项目中。我无法更改该xml,因为它不是我创建的。我会尽量简化它。

我想读取其中具有多种类型的数组。只要项目在[XmlArray(“”)]标记内,就没有问题。 其中一种类型可以包含其他具有相同类型的数组

例如:

Xml

<node Name="testbase">
    <items>
        <node Name="test1"/>
            <items>
                <node Name="test2"/>
                <node Name="test3"/>
            </items>
        <othernode Name="test4"/>   
    </items>
</node>

C#

public class Base
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
}

public class Node : Base
{
    [XmlArray("items")]
    [XmlArrayItem("node", typeof(Node))]
    [XmlArrayItem("othernode", typeof(Othernode))]
    public Base[] nodes { get; set; }
}

public class Othernode : Base
{
}

不幸的是,我有这样的东西:

<node Name="testbase">
    <node Name="test1">
        <node Name="test2"/>
        <node Name="test3"/>    
    </node>
    <othernode Name="test4"/>   
</node>

数组元素“丢失”。通常,我只将[XmlElemtn(“”)]标签用于此类操作。

[XmlElement("node")]
public List<Node> Nodes { get; set; }

但是不能再将XmlArrayItem标记用于不同的类型。解决方法是仅使用多个列表/数组,如下所示:

public class Vendor : CreateBase
{
    [XmlElement("node")]
    public List<Node> Nodes { get; set; }

    [XmlElement("othernode")]
    public List<Othernode> Othernodes { get; set; }
}

但是我很想将所有东西都放在一个列表/数组中。如果您使用这种xml序列化,这是否有可能? 也许可以使用模板吗?

亲切问候

1 个答案:

答案 0 :(得分:0)

如果其他人找到了该线程并尝试执行相同的操作: 通过抽象类 [XmlInclude(typeof())] [XmlElement(“”)] 有一种方法,但是它为xml元素本身添加了一个新属性。例如这样的 p3:type =“ XmlDerivedClass”
如果要序列化具有不同类型的xml数组而不使用 [XmlArrayItem(“ node”,typeof(Node))] (这会向xml添加一个额外的数组元素),则可以通过XmlIncludes完成。

就像评论中提到的那样,看来别无他法,它是如何工作的。由于我的要求我不能以任何方式更改xml,因此将通过XmlDocument或XmlReader手动进行操作。