C#XML反序列化
问题描述:
我有xml返回与不同类型的对象数组。当它到达关键字struct时,我遇到了xmlchoiceidentifier问题。当它反序列化时,它只是返回null。C#XML反序列化
这里是我试图反序列化XML:
<struct>
<member>
<name>result</name>
<value><boolean>1</boolean></value>
</member>
<member>
<name>user_info</name>
<value>
<struct>
<member>
<name>First Name</name>
<value><string>John</string></value>
</member>
<member>
<name>Last Name</name>
<value><string>Smith</string></value>
</member>
</struct>
</value>
</member>
</struct>
这里是我对反序列化的代码:
public class ResponseStruct
{
[XmlArray("struct"), XmlArrayItem("member")]
public List<ResponseMember> Struct { get; set; }
}
public class ResponseArray
{
[XmlArray("array"), XmlArrayItem("data")]
public List<ResponseMemberValue> Array { get; set; }
}
public class ResponseMember
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("value")]
public ResponseMemberValue Value { get; set; }
}
public class ResponseMemberValue
{
[XmlChoiceIdentifier("ValueChoice"), XmlElement("boolean", typeof(bool)), XmlElement("int", typeof(int)), XmlElement("string", typeof(string)), XmlElement("datetime", typeof(DateTime)), XmlElement("double", typeof(double)), XmlElement("base64", typeof(string)), XmlElement("array", typeof(ResponseArray)), XmlElement("struct", typeof(ResponseStruct))]
public object Value { get; set; }
[XmlIgnore]
public virtual ValueType ValueChoice { get; set; }
public enum ValueType
{
@string,
@int,
@datetime,
@double,
base64,
array,
boolean,
@struct
}
}
答
你的主要问题是,您所指定[XmlArray("struct"), XmlArrayItem("member")]
为public List<ResponseMember> Struct { get; set; }
。这意味着这个集合的XML应该有一个名为<struct>
的外部包装器元素。但是,外部<struct>
元素是也由包含ResponseMemberValue.Value
属性XmlElement("struct", typeof(ResponseStruct))
属性指定 - 但您的XML只有一个级别的<struct>
元素。因此,您需要指定此集合确实有而不是有一个外部容器元素,通过使用[XmlElement("member")]
。而且,虽然您的XML不包含<array>
元素的示例,但我怀疑您也应该对ResponseArray
也这样做。
接下来,您需要使用[XmlRoot]
或[XmlType]
指定根元素名称。如果使用后者,它将自动用作多态元素Value
元素中的元素名称。
因此:
[XmlType("struct")]
public class ResponseStruct
{
[XmlElement("member")]
public List<ResponseMember> Struct { get; set; }
}
[XmlType("array")]
public class ResponseArray
{
[XmlElement("data")]
public List<ResponseMemberValue> Array { get; set; }
}
public class ResponseMember
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("value")]
public ResponseMemberValue Value { get; set; }
}
public class ResponseMemberValue
{
[XmlChoiceIdentifier("ValueChoice")]
[XmlElement("boolean", typeof(bool)),
XmlElement("int", typeof(int)),
XmlElement("string", typeof(string)),
XmlElement("datetime", typeof(DateTime)),
XmlElement("double", typeof(double)),
XmlElement("base64", typeof(string)),
XmlElement(typeof(ResponseArray)),
XmlElement(typeof(ResponseStruct))]
public object Value { get; set; }
[XmlIgnore]
public virtual ValueType ValueChoice { get; set; }
public enum ValueType
{
@string,
@int,
@datetime,
@double,
base64,
array,
boolean,
@struct
}
}
fiddle原型。
复制你的xml,在你的VS菜单中,选择*编辑/粘贴特殊/粘贴XML作为类*, – Eser