2016-11-07 21 views
0

我收到以下XML示例。我需要反序列化它。反序列化列表項內的列表

<?xml version="1.0" encoding="utf-16"?> 
<Users filename="testfile"> 
    <User name="John Doe" age="51"> 
     <Addresses> 
      <Address street="1511 Smith Pl." city="Boulder" state="CO" zip="80000" /> 
      <Address street="1820 Main St." city="Lafayette" state="CO" zip="80100" /> 
     </Addresses> 
    </User> 
    <User name="Jeff Jones" age="35"> 
     <Addresses> 
      <Address street="2111 Jefferson Rd.." city="Colorado Springs" state="CO" zip="80099" /> 
     </Addresses> 
    </User> 
</Users> 

我使用下面的代碼:

private void button1_Click(object sender, EventArgs e) 
    { 
     XmlSerializer xmlIn = new XmlSerializer(typeof(UserItems)); 
     StreamReader srIn = new StreamReader("c:\\address.xml"); 
     UserItems uiItems; 

     uiItems = (UserItems)xmlIn.Deserialize(srIn); 

     srIn.Close(); 
    } 
    } 

    [XmlRoot("Users")] 
    public class UserItems 
    { 
    private List<UserItem> p_liUserItems; 

    [XmlAttribute("filename")] public string FileName { get; set; } 

    [XmlElement("User")] 
    public List<UserItem> Users 
    { 
     get 
     { 
     return p_liUserItems; 
     } 
     set 
     { 
     p_liUserItems = value; 
     } 
    } 
    } 

    [Serializable] 
    public class UserItem 
    { 
    private List<AddressItem> p_liAddressItems = new List<AddressItem>(); 

    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("age")] 
    public string Age { get; set; } 

    [XmlElement("Address")] 
    public List<AddressItem> Addresses 
    { 
     get 
     { 
     return p_liAddressItems; 
     } 
     set 
     { 
     p_liAddressItems = value; 
     } 
    } 
    } 

    [Serializable] 
    public class AddressItem 
    { 
    [XmlAttribute("street")] 
    public string Street { get; set; } 
    [XmlAttribute("city")] 
    public string City { get; set; } 
    [XmlAttribute("state")] 
    public string State { get; set; } 
    [XmlAttribute("zip")] 
    public string ZipCode { get; set; } 
    } 

這反序列化精,到一個點。我得到每個用戶的信息,但我沒有得到每個用戶的任何地址。每個用戶都有一個空白地址列表如何去反序列化收集項目中的集合?

+0

也許是因爲在代碼中它'''[XmlElement(「Address」)]'''=>但是在XML中'''''' – tym32167

回答

1

您的AddressesXmlElement,但它是一個包裝數組。另外

[XmlArray("Addresses")] 
[XmlArrayItem("Address")] 
public List<AddressItem> Addresses 
{ 
    get 
    { 
     return p_liAddressItems; 
    } 
    set 
    { 
     p_liAddressItems = value; 
    } 
} 

,如果你想包裝類:

[Serializable] 
public class UserItem 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("age")] 
    public string Age { get; set; } 

    [XmlElement("Addresses")] 
    public AddressWrapper Addresses { get; set; } 
} 

[Serializable] 
public class AddressWrapper 
{ 
    [XmlElement("Address")] 
    public List<AddressItem> Addresses { get; set; } 
} 

可以的(de)使用XmlArrayXmlArrayItem防止不得不爲Addresses創造和裝飾的包裝類序列化另見Wrapping Serialized Array Elements with the Name of the Array

+1

呃,你對我來說太快:) – tym32167

+0

對我而言沒有任何作用。我在Deserialize調用中得到以下內容:在System.Xml.dll – Scott

+0

@Scott中發生了類型爲「System.InvalidOperationException」的未處理異常,它們都與您的問題中的XML一起工作。點擊InnerExceptions直到你得到實際的錯誤,讀取它,研究它。 – CodeCaster