【发布时间】:2015-03-24 15:03:35
【问题描述】:
我正在开发一个返回单个 XML 块的项目,例如:
<root>
<x_val />
<x_val2 />
<x_addr1 />
<x_addr2 />
<x_city />
<x_state />
<x_country />
<x_zip />
</root>
在这个项目中,我可以进行多次调用,返回各种信息,但大部分都会在底部包含地址信息。
在编写我的 C# 类时,我不希望必须为我创建的每个响应对象中的每个节点创建属性。相反,我更愿意定义一个 Address 对象,这样使用:
[XmlRoot("root")]
[Serializable]
public class ReturnItem1
{
[XmlElement("x_val")]
public string FirstValue{ get; set; }
[XmlElement("x_val2")]
public string SecondValue{ get; set; }
public Address AddressInfo { get; set; }
public ReturnItem1()
{
AddressInfo = new Address();
}
}
public class Address
{
[XmlElement("x_addr1")]
public string Address1 { get; set; }
[XmlElement("x_addr2")]
public string Address2 { get; set; }
[XmlElement("x_city")]
public string City { get; set; }
[XmlElement("x_state")]
public string State { get; set; }
[XmlElement("x_country")]
public string Country { get; set; }
[XmlElement("x_zip")]
public string PostalCode { get; set; }
}
反序列化时,我正在执行以下逻辑(响应类型为 XElement):
var serializer = new XmlSerializer(typeof(ReturnItem1));
var returnObject = (ReturnItem1)serializer.Deserialize(response.CreateReader());
FirstValue 和 SecondValue 的值填充在 returnObject 中,但 Address 中的属性始终为 null。
我尝试将 [XmlRoot("root)"] 属性添加到 Address 类,但没有奏效。也没有将 ReturnItem1 中 Address 属性的 XmlElement 属性设置为“root”或任何其他节点名称。
有没有办法使用这种方法将单个 XML 节点反序列化为具有一个或多个子对象的对象?
【问题讨论】:
标签: c# xml serialization xml-deserialization