2011-08-29 89 views
1

試圖反序列化XML字符串,但總是讓問題像這些元素:XML反序列化null元素?

<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:無=」 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,但不確定是否有更好的解決方案?

編輯:

只是做了一個小測試,將XSI:nill =「真」的XML空元素確實會與我現有的C#代碼工作。 但我確實需要確保從XML映射的C#類具有可爲空元素類型的那些來自XML的xsi:nill ='true'的空元素。但它是有道理的:當一些數據字段來自XML可能是一個空類型,我需要顯式定義對應的數據類型爲可空。我對此非常滿意,而不是我目前的解決方案。

回答

0

我不知道你的問題的答案,但在我看來,要求你的同事修復他們的XML並不是正確的答案。在編寫網絡和文件格式代碼時,通常會採取「保守的做法,但接受你的做法」等等。

也就是說,您應該準備好在傳入的XML流中接收任何東西。如果XML格式正確且包含所需的元素和屬性,則應該能夠正確解析它。如果它包含不允許的元素,則應優雅地忽略它們或引發錯誤狀況。如果XML格式不正確,您應該提出錯誤。

否則你的程序在面對來自另一端的錯誤時不會很健壯,並且可能存在安全漏洞。

+0

嗨@唐吉訶德,總的來說我傾向於同意你的看法。但是在這種情況下,我相信它們提供了語義上正確的XML,但沒有正確的格式。我可以在我的代碼中清除它們的XMN,這是我正在計劃的,或者修改我的C#類來處理它,這將起作用,但涉及更多的工作。或者我可以讓他們更改XML,這樣可以讓我們和其他開發人員更輕鬆地使用他們的API。所以是的,我有選擇,如果我可以選擇,它會更聰明,而不是更難。 –

+0

僅供參考,請參閱:http://stackoverflow.com/questions/774192/what-is-the-correct-way-to-represent-null-xml-elements以瞭解爲什麼我認爲他們的XML不代表null元素格式正確。 –