反序列化列表项中的列表
Deserialize list within list item
我有下面的样本 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; }
}
这在一定程度上可以很好地反序列化。我获得了每个用户的信息,但没有获得每个用户的任何地址。每个用户都有一个空白地址列表 如何在集合项中反序列化集合?
你的 Addresses
是一个 XmlElement
,但是它包装了一个数组。您可以使用 XmlArray
和 XmlArrayItem
对其进行(反)序列化,以防止必须为 Addresses
:
创建和修饰包装器 class
[XmlArray("Addresses")]
[XmlArrayItem("Address")]
public List<AddressItem> Addresses
{
get
{
return p_liAddressItems;
}
set
{
p_liAddressItems = value;
}
}
或者,如果您想要包装器class:
[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。
我有下面的样本 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; }
}
这在一定程度上可以很好地反序列化。我获得了每个用户的信息,但没有获得每个用户的任何地址。每个用户都有一个空白地址列表 如何在集合项中反序列化集合?
你的 Addresses
是一个 XmlElement
,但是它包装了一个数组。您可以使用 XmlArray
和 XmlArrayItem
对其进行(反)序列化,以防止必须为 Addresses
:
[XmlArray("Addresses")]
[XmlArrayItem("Address")]
public List<AddressItem> Addresses
{
get
{
return p_liAddressItems;
}
set
{
p_liAddressItems = value;
}
}
或者,如果您想要包装器class:
[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。