簡體   English   中英

XML反序列化null元素?

[英]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.

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