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 
    } 
} 
+2

复制你的xml,在你的VS菜单中,选择*编辑/粘贴特殊/粘贴XML作为类*, – Eser

你的主要问题是,您所指定[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原型。