我正在尝试将XML序列化为Class,PostalAddress。邮政地址看起来像这样
public class PostalAddress
{
public string DeliverTo { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
[XmlAttribute("isoCountryCode")]
public string CountryCode { get; set; }
public string Country { get; set; }
}
输入XML文档是
<PostalAddress>
<DeliverTo>SomeBody</DeliverTo>
<Street>Some Street Address</Street>
<City>MyCity</City>
<PostalCode>US-1013</PostalCode>
<Country isoCountryCode="US">US</Country>
</PostalAddress>
我用于序列化的C#代码是
现在反序列化之后,我能够在相应的属性中看到XML中的值,但是我想要映射到Property,CountryCode中的是缺少属性值。
var serializer = new XmlSerializer(typeof(PostalAddress));
var xmlReaderSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse}
PostalAddress postalAddress;
using (var reader = XmlReader.Create(new StringReader(inputDocument.ToString()), xmlReaderSettings))
{
postalAddress= (PostalAddress)serializer.Deserialize(reader);
}
请你帮忙,我在哪里错过了什么?``
答案 0 :(得分:1)
XmlAttribute
将无法在您正在使用它的上下文中工作,因为它正在查看没有属性的元素PostalAddress
。您想要的属性isoCountryCode
位于子元素Country
上。
要完成这项工作,您需要为Country
元素定义另一个类。例如,您可以使用如下所示的类。
public class PostalAddress
{
public string DeliverTo { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public Country Country { get; set; }
}
[XmlRoot("Country")]
public class Country
{
[XmlAttribute("isoCountryCode")]
public string IsoCountryCode { get; set;}
[XmlText]
public string Name { get; set; }
}
或者,如果您无法更改类结构,可以使用IXmlSerializable
界面查看自定义反序列化。
答案 1 :(得分:0)
使用XmlAttribute
- 属性时,该属性应位于与该类对应的元素上。换句话说,如果你要像这样构造你的XML文档,那么该属性将被反序列化到属性中:
<PostalAddress isoCountryCode="US">...</PostalAddress>
但是,在为国家/地区添加另一个类时,可以正确地反序列化XML:
public class PostalAddress
{
public string DeliverTo { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
[XmlElement("Country")]
public CountryCode CountryCode;
}
public class CountryCode
{
[XmlAttribute("isoCountryCode")]
public string Code { get; set; }
[XmlText]
public string Country { get; set; }
}
答案 2 :(得分:0)
您必须使用名为CountryCode&amp;的两个属性为Country元素创建类。文本...
public class PostalAddress
{
public string DeliverTo { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public Country Country { get; set; }
}
public class Country
{
[XmlAttribute("isoCountryCode")]
public string CountryCode { get; set; }
[XmlText]
public string Description { get; set; }
}