2013-02-09 108 views
5

我從http web請求中檢索xml數據並將數據反序列化爲對象。將嵌套xml反序列化爲C#對象

這是一個xml結構示例。

<users> 
    <user> 
     <name>...</name> 
     <orders> 
      <order> 
       <number>...</number> 
      </order>   
      ... 
     </orders> 
    </user> 
    <user> 
     <name>...</name> 
     <orders></orders> 
    </user> 
    ... 
</users> 

我有四節課

public class Users 
{ 
    [XmlElement("user")] 
    public User[] UserList { get; set; } 
} 

public class User 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 

    [XmlArray("orders")] 
    public Orders OrderList { get; set; } 
} 

public class Orders 
{ 
    [XmlElement("order")] 
    public Order[] Order { get; set; } 
} 

public class Order 
{ 
    [XmlElement("number")] 
    public string Number { get; set; } 
} 

我覺得三類應該是不夠的 - 有一個令[]在用戶級和擺脫的「訂單」類。那可能嗎?無論我嘗試過什麼都行不通。

謝謝。

+0

但它是什麼,你試過嗎? – 2013-02-09 00:14:26

+0

**它是如何不起作用的**?我們不介意讀者.. – 2013-02-09 00:42:58

+0

爲什麼這很重要?它不起作用。 – user471317 2013-02-09 00:49:53

回答

12

這應該工作

XmlSerializer ser = new XmlSerializer(typeof(Users)); 
var u = (Users)ser.Deserialize(stream); 


[XmlRoot("users")] 
public class Users 
{ 
    [XmlElement("user")] 
    public User[] UserList { get; set; } 
} 

public class User 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 

    [XmlArray("orders"),XmlArrayItem("order")] 
    public Order[] OrderList { get; set; } 
} 

[XmlRoot("order")] 
public class Order 
{ 
    [XmlElement("number")] 
    public string Number { get; set; } 
} 
2

您只能使用3個班級。所有您需要做的是Xml.Serialization.XmlType添加到您的類

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 

[Xml.Serialization.XmlType("users", IncludeInSchema = true)] 
public class Users 
{ 
[XmlElement("user")] 
public List<User> UserList { 
    get { 
     if (m_UserList == null) { 
      m_UserList = new List<User>(); 
     } 
     return m_UserList; 
    } 
} 

private List<User> m_UserList; 
} 
[Xml.Serialization.XmlType("user", IncludeInSchema = true)] 
public class User 
{ 
[XmlElement("name")] 
public string Name { 
    get { return m_Name; } 
    set { m_Name = value; } 
} 

private string m_Name; 
[XmlArray("orders")] 
public List<Orders> OrderList { 
    get { 
     if (m_OrderList == null) { 
      m_OrderList = new List<Orders>(); 
     } 
     return m_OrderList; 
    } 
} 
private List<Orders> m_OrderList; 
} 
[Xml.Serialization.XmlType("orders", IncludeInSchema = true)] 
public class Orders 
{ 
[XmlElement("number")] 
public string Number { 
    get { return m_Number; } 
    set { m_Number = value; } 
} 
private string m_Number; 
}