如何在C#中使用LINQ to XML检查XDocument中是否存在Attribute

Tho*_*eld 1 c# linq

我有一个像xml这样的文件

 <Root>
   <Child Name="A" />
 </Root>
Run Code Online (Sandbox Code Playgroud)

我需要检查"Child"元素是否具有"val"属性.如果是,如果该值大于零,则需要将布尔变量的值更改为true;

现在我正在使用

bool bVal=false

bVal=XDocument.Load(Application.StartupPath+"\\foo.xml")
          .Descendants("Child")
          .Select(TEMP => (Int32)TEMP.Attribute("val")).ToList()[0]>0?true:false;
Run Code Online (Sandbox Code Playgroud)

如果xml是这样的话,这个表达式工作正常

<Root>
  <Child Name="A" val ="2" />
</Root>
Run Code Online (Sandbox Code Playgroud)

但如果xml不包含"val"属性,则抛出异常.

如何修改上面的表达式(Query)来检查是否存在"val"属性.

Jon*_*eet 6

在这种情况下,我将查询重写为:

bool bVal = XDocument.Load(Application.StartupPath+"\\foo.xml")
                     .Descendants("Child")
                     .Select(x => (int?) x.Attribute("val"))
                     .FirstOrDefault(x => x != null) > 0;
Run Code Online (Sandbox Code Playgroud)

这使用三个功能:

  • 如果该属性不存在,则转换XAttribute为将导致null值int?int
  • 使用FirstOrDefault而不是ToList()[0]更高效,即使没有值也可以工作
  • 当任一操作数为空时,提升的>运算符将返回False

如果要检查是否有任何正面的价值观,那就更简单了:

bool bVal = XDocument.Load(Application.StartupPath+"\\foo.xml")
                     .Descendants("Child")
                     .Select(x => (int?) x.Attribute("val"))
                     .Any(x => x > 0);
Run Code Online (Sandbox Code Playgroud)