【问题标题】:Differentiate null and string.Empty values in an XElement区分 XElement 中的 null 和 string.Empty 值
【发布时间】:2012-11-14 16:30:52
【问题描述】:

我有两个 XElement 实例:

var el1 = new System.Xml.Linq.XElement("xel", null);
var el2 = new System.Xml.Linq.XElement("xel", string.Empty);

el1 看起来像这样:

<xel />

el2 看起来像这样:

<xel></xel>

然而,bothValue 属性等于string.Empty

我可以想出很多技巧来区分 XElement 中的 nullstring.Empty,但是框架中是否有一些我缺少的东西可以做到这一点?

【问题讨论】:

  • 表示 null 的方法是完全省略元素。存在的元素将使用非空值进行解析。
  • @AnthonyPegram 是可能的,除非有一个模式指定 xel 的 MinOccurs > 0。无论出于何种原因,这似乎在我的部门中经常发生。
  • 根据 XML 标准,&lt;xel /&gt;&lt;xel&gt;&lt;/xel&gt; 必须等效。因此,要区分字符串的 ""null,可以按照上面 Anthony 的建议,或者在元素内使用属性,例如 &lt;xel isNull="True" /&gt;

标签: c# .net linq-to-xml xelement


【解决方案1】:

el1.IsEmpty 将返回 true,另一方面,el2.IsEmpty 将返回 false。

【讨论】:

  • 正确,但我认为您不应该使用IsEmpty,因为el1el2 的语义必须相同。 MSDN 的 XML 参考还有 writes在 XML 中,您可以用开始和结束标记来指示一个空元素,并且中间没有空格或内容,例如,&lt;giggle&gt;&lt;/giggle&gt;,或者您可以使用一个空标记,用于例如,&lt;giggle/&gt;。这两种形式在 XML 解析器中产生相同的结果。
  • @JeppeStigNielsen - cmets 和其他答案提出了非常好的观点,但我认为这最直接地回答了这个问题。我可能有点不清楚,但我的问题是,“XElement 的什么属性可以区分带有结束标记的元素和没有结束标记的元素?”
【解决方案2】:

来自XML Schema Standard

2.6.2 xsi:nil

XML Schema:Structures 引入了一种机制,用于指示元素应该被接受 为·有效· 当它没有内容时,尽管内容类型不需要甚至不一定允许空内容。如果一个元素的属性xsi:nil 的值为true,它可能是没有内容的有效的。如此标记的元素必须为空,但如果相应的复杂类型允许,则可以携带属性。

所以对您来说,您必须将 xsi 命名空间添加到您的 XmlDocument 中。然后元素看起来像

<xel xsi:nil="true" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2011-09-07
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多