我想创建一个像
这样的结构<root>
<items>
<myns:a s="a"/>
<b s="a"/>
</items>
</root>
root中的项目是公共基类的后代。我无法让它发挥作用。以下代码段创建
<root>
<items>
<Base xsi:type="A" s="a"/>
<Base xsi:type="B" s="a"/>
</items>
</root>
[Serializable]
[XmlInclude(typeof(A))]
[XmlInclude(typeof(B))]
public class Base
{
}
[Serializable]
public class A : Base
{
public string a = "a";
}
[Serializable]
public class B : Base
{
public string b = "b";
}
[Serializable]
public class Root
{
public List<Base> items = new List<Base>();
}
如果我使用XmlType属性,我可以更改xsi:type name,但不能更改name标签。 我还想在其中一个标签上使用自定义命名空间,但如果我将Namespace添加到XmlType,我会收到一条错误消息,说明找不到该类型,并且必须添加XmlInclude ..
我想这实际上非常简单,我只是不知道如何......
答案 0 :(得分:10)
您在寻找XmlArrayItemAttribute吗?
[Serializable]
public class Root
{
[XmlArrayItem("a", typeof(A), Namespace = "myns")]
[XmlArrayItem("b", typeof(B))]
public List<Base> items = new List<Base>();
}
这将序列化为:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<items>
<a xmlns="myns">
<a>a</a>
</a>
<b>
<b>b</b>
</b>
</items>
</Root>
如果您希望项目是Root的直接子项而不是项目元素,也可以使用XmlElementAttribute。