2016-11-07 5 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 ("Адрес")]' '' => Но в XML '' '' '' – tym32167

ответ

1

Ваш Addresses является XmlElement, но тот, который обертывает массив. Вы можете (де) сериализовать с помощью XmlArray и XmlArrayItem для предотвращения того, чтобы создать и украсить класс-оболочку для Addresses:

[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; } 
} 

См. Также Wrapping Serialized Array Elements with the Name of the Array.

+1

эм, ты слишком быстро для меня :) – tym32167

+0

Ни работает для меня. Я получаю следующее в вызове Deserialize: необработанное исключение типа «System.InvalidOperationException» произошло в System.Xml.dll – Scott

+0

@Scott работают с XML из вашего вопроса. Перейдите через InnerExceptions, пока не получите фактическую ошибку, прочитайте ее, исследуйте ее. – CodeCaster

Смежные вопросы