XML 数组序列化为不同类型,没有 "parent" 数组标识符
XML Array Serialize with different types without the "parent" array identifier
我尝试将 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>
数组元素为"missing"。通常我只是将 [XmlElemtn("")] 标签用于类似的东西。
[XmlElement("node")]
public List<Node> Nodes { get; set; }
但是不能再对不同的类型使用 XmlArrayItem 标签。解决方法是像这样使用多个 lists/arrays:
public class Vendor : CreateBase
{
[XmlElement("node")]
public List<Node> Nodes { get; set; }
[XmlElement("othernode")]
public List<Othernode> Othernodes { get; set; }
}
但我很想把所有东西都集于一身 list/array。如果您使用这种 xml 序列化,这有可能吗?
有没有办法使用模板?
亲切的问候
如果其他人找到此话题并尝试做同样的事情:
有一种方法可以通过抽象 类、[XmlInclude(typeof())] 和 [XmlElement("")] 但它向 xml 元素本身添加一个新属性。例如像这样 p3:type="XmlDerivedClass".
如果您想序列化具有不同类型的 xml 数组而不使用 [XmlArrayItem("node", typeof(Node))] (将额外的数组元素添加到xml) 您可以通过 XmlIncludes 执行此操作。
就像评论中提到的那样,看起来没有别的办法,这就是它的工作原理。由于我无法以任何方式更改 xml 的要求,我将通过 XmlDocument 或 XmlReader 手动完成。
我尝试将 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>
数组元素为"missing"。通常我只是将 [XmlElemtn("")] 标签用于类似的东西。
[XmlElement("node")]
public List<Node> Nodes { get; set; }
但是不能再对不同的类型使用 XmlArrayItem 标签。解决方法是像这样使用多个 lists/arrays:
public class Vendor : CreateBase
{
[XmlElement("node")]
public List<Node> Nodes { get; set; }
[XmlElement("othernode")]
public List<Othernode> Othernodes { get; set; }
}
但我很想把所有东西都集于一身 list/array。如果您使用这种 xml 序列化,这有可能吗? 有没有办法使用模板?
亲切的问候
如果其他人找到此话题并尝试做同样的事情:
有一种方法可以通过抽象 类、[XmlInclude(typeof())] 和 [XmlElement("")] 但它向 xml 元素本身添加一个新属性。例如像这样 p3:type="XmlDerivedClass".
如果您想序列化具有不同类型的 xml 数组而不使用 [XmlArrayItem("node", typeof(Node))] (将额外的数组元素添加到xml) 您可以通过 XmlIncludes 执行此操作。
就像评论中提到的那样,看起来没有别的办法,这就是它的工作原理。由于我无法以任何方式更改 xml 的要求,我将通过 XmlDocument 或 XmlReader 手动完成。