試圖反序列化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可能是一個空類型,我需要顯式定義對應的數據類型爲可空。我對此非常滿意,而不是我目前的解決方案。
嗨@唐吉訶德,總的來說我傾向於同意你的看法。但是在這種情況下,我相信它們提供了語義上正確的XML,但沒有正確的格式。我可以在我的代碼中清除它們的XMN,這是我正在計劃的,或者修改我的C#類來處理它,這將起作用,但涉及更多的工作。或者我可以讓他們更改XML,這樣可以讓我們和其他開發人員更輕鬆地使用他們的API。所以是的,我有選擇,如果我可以選擇,它會更聰明,而不是更難。 –
僅供參考,請參閱:http://stackoverflow.com/questions/774192/what-is-the-correct-way-to-represent-null-xml-elements以瞭解爲什麼我認爲他們的XML不代表null元素格式正確。 –