XML序列化不读取属性值

时间:2015-06-24 19:15:34

标签: c# xml serialization

我正在尝试将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);
}

请你帮忙,我在哪里错过了什么?``

3 个答案:

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