试图反序列化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元素格式正确。 –