【问题标题】:XML deserialize null elements?XML反序列化空元素?
【发布时间】:2011-08-29 05:34:42
【问题描述】:

尝试反序列化 Xml 字符串,但总是遇到以下元素的问题:

<Taxable />
<DefaultPurchasePrice />

我的 C# 代码 sn-p:

[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# 类对于来自 XML 且 xsi:nill='true' 的那些 null 元素具有可为空的数据类型。但这是有道理的:当某些来自 XML 的数据字段可能是空类型时,我需要将相应的数据类型显式定义为可为空的。我对此感到非常满意,而不是我目前的解决方案。

【问题讨论】:

    标签: c# xml nullable


    【解决方案1】:

    我不知道您的问题的答案,但在我看来,要求您的同事修复他们的 XML 并不是正确的答案。在编写网络和文件格式代码时,普遍的智慧是“在你给予的东西上保守,但在你收到的东西上接受”,或类似的。

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

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

    【讨论】:

    • 嗨@Don Quixote,总的来说,我倾向于同意你的观点。但在这种情况下,我相信它们提供了语义上正确的 XML,但没有必要以正确的格式提供。我可以在我的代码中清理他们的 XMN,这是我计划做的,或者修改我的 C# 类来处理它,这将起作用,但涉及的工作很少。或者我可以要求他们更改 XML,以便我们和其他开发人员更容易使用他们的 API。所以是的,我确实有一个选择,如果我可以选择,它会更聪明地工作,而不是更难。
    • 作为参考,请参阅:stackoverflow.com/questions/774192/… 了解为什么我认为他们的 XML 不能以正确的格式表示空元素。
    猜你喜欢
    • 2016-12-02
    • 2012-02-25
    • 2011-06-24
    • 1970-01-01
    • 2023-03-30
    • 2011-02-27
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多