2016-05-14 97 views
1

我有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

回答

2

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