XML反序列化空元素

本文关键字:元素 反序列化 XML | 更新日期: 2023-09-27 18:06:48

尝试反序列化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 "

属性应该可以解决我的问题。但是由于我们使用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字符串中有很多空元素,另一方可以修复他们的XML所以我不需要对我的反序列化代码做任何事情,对吧?

无论如何,我可以在我的代码中做些什么,在反序列化之前,XML可以有适当的xsi:nil="true"属性的空元素,这样我不需要在我的c#代码做太多,但可以快速修复他们的XML?

我正在考虑@Ryan的解决方案在第二最后从这里:deserialize-xml-with-empty-elements-in-c,但不确定是否有更好的解决方案?

编辑:

刚刚做了一个小测试,在XML null元素中添加xsi:nill='true'确实可以与我现有的c#代码一起工作。但我确实需要确保我的c#类映射从XML有可空的数据类型为那些空元素来自XML与xsi:nill='true'。但这是有意义的:当来自XML的某些数据字段可能是空类型时,我需要显式地将相应的数据类型定义为可空类型。比起我现在的解决方案,我更喜欢这样。

XML反序列化空元素

我不知道您的问题的答案,但在我看来,要求您的同事修复他们的XML并不是正确的答案。在编写网络和文件格式代码时,"保守你所给予的,但接受你所得到的"或诸如此类的常识是很普遍的。

也就是说,您应该准备好接收传入XML流中的任何内容。如果XML格式良好,并且包含所需的元素和属性,则应该能够正确解析它。如果它包含您不允许的元素,您应该优雅地忽略它们或引发错误条件。如果XML格式不正确,则应抛出错误。

否则您的程序在面对来自另一端的错误时将不健壮,并且可能存在安全漏洞。