繁体   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