簡體   English   中英

XML 序列化不讀取屬性值

[英]XML Serialization not reading Attribute values

我正在嘗試將 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接口查看自定義反序列化。

您必須使用兩個名為 CountryCode 和 Text 的屬性為 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; }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM