【问题标题】:XML Serialization not reading Attribute valuesXML序列化不读取属性值
【发布时间】:2015-06-25 03:44:01
【问题描述】:

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

你能帮忙看看我在哪里遗漏了什么吗?``

【问题讨论】:

    标签: c# xml serialization


    【解决方案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 接口查看自定义反序列化。

    【讨论】:

    • 非常感谢您的回复。我现在开始工作了:)
    【解决方案2】:

    您必须为 Country 元素创建类,其中包含两个名为 CountryCode 和 Text 的属性...

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

    【讨论】:

    • 非常感谢您的回复。我现在开始工作了:)
    【解决方案3】:

    使用XmlAttribute-attribute 时,该属性应位于与类对应的元素上。换句话说,如果您像这样构建您的 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; }
    }
    

    【讨论】:

    • 非常感谢您的回复。我现在开始工作了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多