使用XDocument按属性名称及其值查找元素

时间:2016-02-23 21:15:58

标签: c# linq-to-xml

好吧,使用.NET 3.5和XDocument我试图找到<table class='imgcr'>元素。我创建了下面的代码但当然崩溃了,因为e.Attribute("class")可能为null。那么......我必须在任何地方进行无效检查?这将加倍e.Attribute("class")。根本不是简洁的解决方案。

XElement table =
    d.Descendants("table").
    SingleOrDefault(e => e.Attribute("class").Value == "imgcr");

2 个答案:

答案 0 :(得分:2)

如果您确定因为table元素可能没有class属性而引发异常,那么您可以这样做:

XElement table =
    d.Descendants("table").
    SingleOrDefault(e => ((string)e.Attribute("class")) == "imgcr");

在这种情况下,您将null值转换为string,最后为null,因此您要比较null == "imgcr"false }。

如果您需要有关如何检索属性值的更多信息,可以查看此msdn page。在那里你会发现这个肯定:

  

您可以将XAttribute转换为所需类型;明确的   转换运算符然后转换元素的内容或   属性为指定的类型。

答案 1 :(得分:0)

我想这很短暂

XElement table =
  d.Descendants("table").
    SingleOrDefault(e => { var x = e.Attribute("class"); return x==null ? false: x.Value == "imgcr";});

这个更短(但不多 - 除非你可以重复使用t变量。)

XAttribute t = new XAttribute("class","");
XElement table =
  d.Descendants("table").
    SingleOrDefault(e => (e.Attribute("class") ?? t).Value == "imgcr");