我尝试将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序列化,这是否有可能? 也许可以使用模板吗?
亲切问候
答案 0 :(得分:0)
如果其他人找到了该线程并尝试执行相同的操作:
通过抽象类 [XmlInclude(typeof())] 和 [XmlElement(“”)] 有一种方法,但是它为xml元素本身添加了一个新属性。例如这样的 p3:type =“ XmlDerivedClass” 。
如果要序列化具有不同类型的xml数组而不使用 [XmlArrayItem(“ node”,typeof(Node))] (这会向xml添加一个额外的数组元素),则可以通过XmlIncludes完成。
就像评论中提到的那样,看来别无他法,它是如何工作的。由于我的要求我不能以任何方式更改xml,因此将通过XmlDocument或XmlReader手动进行操作。