【问题标题】:XDocument Querying using Lambda使用 Lambda 进行 XDocument 查询
【发布时间】:2012-10-17 13:16:57
【问题描述】:

我有如下所示的 XML

<NodeName Foo="True" Foobar="False" />
<NodeName Foo="False" Foobar="False" />
<NodeName Foo="True" Foobar="False" />

我正在查询这个以查找 Foo 值为 'True' 的 NodeName,使用:

.Where(node => node.Attribute("Foo").Value = "True");

但是,属性 Foo 可能不存在,这会导致异常。

问题是如何实现逻辑来检查属性是否存在,然后检查值是否存在?

我尝试了以下方法,但不确定 else 括号中的内容不返回任何内容,因为目前它不会编译,并出现未在所有路径上返回值的错误。

.Where(node =>
            {
                if (node.Attribute("Foo") != null)
                {
                    node.Attribute("Foo").Value == "True";
                }
                else { }
            });

【问题讨论】:

  • Will .Where(node => node.Attributes("Foo").Any() ? node.Attribute("Foo").Value == "True" : false);工作吗?
  • 它确实有效,但是@Jon Skeet 提供了一种更简洁的方法。

标签: c# xml lambda linq-to-xml


【解决方案1】:

但是,属性 Foo 可能不存在,这会导致异常。

这是从XAttribute(实际上是XElement)到字符串和许多其他类型的显式转换派上用场的地方:

.Where(node => (string) node.Attribute("Foo") == "True");

当没有这样的属性时,转换将返回 null。这比两次查找属性要方便得多 - 一次用于存在,一次用于值。

或者,您可以使用转换为bool?,如果缺少该属性,会返回 null,因此您需要使用 null-coalescing 运算符来有效地提供默认值:

.Where(node => (bool?) node.Attribute("Foo") ?? false);

编辑:就为什么您的语句 lambda 方法不起作用而言,您没有 any 返回语句。这会起作用,但显然这不是我推荐的:

.Where(node =>
        {
            if (node.Attribute("Foo") != null)
            {
                return node.Attribute("Foo").Value == "True";
            }
            else
            {
                return false;
            }
        });

【讨论】:

  • 这些非常适合我正在做的事情,为知识洞察力干杯。将在允许时标记答案。
  • 不错!还没想到这种可能性。
  • 刚刚尝试了.Where(node =&gt; (bool) node.Attribute("Foo") ?? false);这一行,但它无法编译,因为不能使用??带有 bool 和 bool。
  • @Mike:对不起,那应该是bool?的演员表
【解决方案2】:

lambda 必须返回一个布尔值来确定节点是否会在结果集中。 试试这个:

 xml.Where(node => node.Attribute("Foo") != null && node.Attribute("Foo").Value == "True");

【讨论】:

    【解决方案3】:

    就这样做

    .Where(node => node.Attribute("Foo") == null ? false : node.Attribute("Foo").Value == "True"); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多