[英]XML deserialize null elements?
試圖反序列化Xml字符串,但總是遇到類似以下元素的問題:
<Taxable />
<DefaultPurchasePrice />
我的C#代碼段:
[XmlRoot(ElementName = "Product", Namespace = "http://api.test.com/version/1", IsNullable = false)]
public class Product
{
public Guid Guid { get; set; }
public string ProductName { get; set; }
public bool Taxable { get; set; }
public Decimal DefautSellPrice { get; set; }
[XmlElement("DefaultPurchasePrice")]
public string DefaultPurchasePriceElement
{
get
{
if (DefaultPurchasePrice == null)
return String.Empty;
else
return DefaultPurchasePrice.ToString();
}
set
{
if (value == null | value.Length == 0)
DefaultPurchasePrice = null;
else
DefaultPurchasePrice = Convert.ToDecimal(value);
}
}
[XmlIgnore]
public decimal? DefaultPurchasePrice{ get; set;}
}
似乎
xsi:nil =“ true”
XML屬性應該可以解決我的問題。 但是,由於我們正在使用REST服務器提供的XML作為API測試的一部分。 我們沒有直接控制XML的構造方式,但是我們可以給他們反饋。 因此,我認為我應該明確要求他們修復XML,因為這是XML的問題吧?
同時,我可以通過以下代碼反序列化各個元素:
[XmlElement("DefaultPurchasePrice")]
public string DefaultPurchasePriceElement
{
get
{
if (DefaultPurchasePrice == null)
return String.Empty;
else
return DefaultPurchasePrice.ToString();
}
set
{
if (value == null | value.Length == 0)
DefaultPurchasePrice = null;
else
DefaultPurchasePrice = Convert.ToDecimal(value);
}
}
[XmlIgnore]
public decimal? DefaultPurchasePrice{ get; set;}
但是XML字符串中有很多null元素,而且,另一方可以修復其XML,因此在這種情況下我不需要對反序列化代碼做任何事情,對嗎?
無論如何,我可以在反序列化之前在代碼中做些什么,以便XML可以為null元素提供適當的xsi:nil =“ true”屬性,這樣我就不需要在C#代碼中做很多事情,但是可以快速修復其XML?
我正在從這里倒數第二個考慮@Ryan的解決方案: deserialize-xml-with-empty-elements-in-c ,但不確定是否有更好的解決方案?
編輯:
只是做了一個小測試,在XML空元素中添加xsi:nill ='true'確實可以與我現有的C#代碼一起使用。 但是我確實需要確保從XML映射的C#類具有可空的datattype,以用於那些來自XML且帶有xsi:nill ='true'的空元素。 但這是有道理的:當來自XML的某些數據字段可能是null類型時,我需要將對應的數據類型顯式定義為nullable。 我對此感到非常滿意,而不是我當前的解決方案。
我不知道您問題的答案,但在我看來,要求您的同事修復XML並不是正確的答案。 將網絡和文件格式代碼編寫為“對所提供的內容保持保守,但在所接收的內容中接受”或類似的東西,這是常識。
也就是說,您應該准備好在傳入的XML流中接收幾乎所有內容。 如果XML格式正確,並且包含所需的元素和屬性,則應該能夠正確解析它。 如果其中包含您不允許的元素,則應優雅地忽略它們或引發錯誤情況。 如果XML格式不正確,則應該引發錯誤。
否則,面對來自另一端的錯誤,您的程序將不會很健壯,並且可能會有安全漏洞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.