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

你能帮我把东西弄丢吗

XML序列化未读取属性值

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