2011-08-29 207 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元素格式正确。 –