对XElement进行空检查

时间:2011-05-23 10:51:04

标签: c# xml linq-to-xml

我当前的项目(C#3.5)有很多像这样的代码(elem是XElement的一个实例):

textbox1.Text = elem.Element("TagName") == null ? "" : elem.Element("TagName").Value;

有没有办法在不重复调用elem.Element()且不使用扩展方法的情况下编写相同的东西? 也许使用lambdas? (但我无法弄清楚如何。)

6 个答案:

答案 0 :(得分:13)

XElement显式转换为实际调用.Value的String(和a bunch of other types)。 换句话说,你可以这样写:

var value = (String)elem.Element("TagName");

我认为如果实际元素也为空,这将返回null

-edit -

验证, 这是一个例子:

 var x = new XElement("EmptyElement");
 var n = (String)x.Element("NonExsistingElement");
在此之后

n将为null。

答案 1 :(得分:7)

是。你可以这样写:

(string)elem.Element("TagName") ?? "";

这是 null合并运算符

这意味着如果左侧不为空,则使用左侧。如果为null,则使用右侧。

答案 2 :(得分:2)

有关此类行为的CodeProject上有一篇很棒的文章: http://www.codeproject.com/KB/cs/maybemonads.aspx

public static TResult With<TInput, TResult>(this TInput o, 
       Func<TInput, TResult> evaluator)
       where TResult : class where TInput : class
{
  if (o == null) return null;
  return evaluator(o);
}

string valueEl = this.With(x => elem.Element("TagName")
                  .With(x => x.Value);

CodeProject上提供了其他示例。

答案 3 :(得分:2)

一种疯狂的??方法:

// make this a member-variable somewhere
var emptyElement = XElement.Parse("<x></x>");

(elem.Element("TagName") ?? emptyElement).Value;

会更喜欢扩展方法。

答案 4 :(得分:0)

与此类似,这与Xml布尔检查有关,这是我使用null合并运算符的解决方案:

Convert.ToBoolean(this.xDocument.Root.XPathSelectElement(@"/settings/checkbox[@name = 'MessageArrivedTimeCheckBox']").Value ?? "false");

原因是默认情况下将xml理解为字符串,其中存在类型解析问题,可以通过xml本身内的序列化参数来解决,但是我怀疑甚至有可能,因为它直到不了解为止运行。也许可以使用类型期望值对元素本身进行声明或赋值?

答案 5 :(得分:0)

这不适用于原始问题,但是由于似乎仍在积极查看此问题,因此这是C#6.0+项目的更新:

从C#6.0开始,使用空条件运算符(?.)和空coalescing运算符(??),您可以执行以下操作:

textbox1.Text = elem.Element("TagName")?.Value ?? "";

Cf。 Null-Conditional Operator DocumentationNull-Coalescing Operator Documentation