XML序列化未读取属性值
本文关键字:属性 读取 序列化 XML | 更新日期: 2023-09-27 17:59:45
我正在尝试将XML序列化为一个类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中的值,但它缺少我想要映射到属性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);
}
你能帮我把东西弄丢吗
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
接口查看自定义取消序列化。
您必须为Country元素创建具有两个名为CountryCode&文本
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; }
}
使用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; }
}