C# 如何在C中使用LINQ to XML检查XDocument中属性的存在性#

C# 如何在C中使用LINQ to XML检查XDocument中属性的存在性#,c#,linq,C#,Linq,我有一个xml文件,比如 <Root> <Child Name="A" /> </Root> 如果xml类似于 <Root> <Child Name="A" val ="2" /> </Root> 但如果xml不包含“val”属性,则会引发异常 如何修改上述表达式(查询)以检查“val”属性的存在。在这种情况下,我将把查询重写为: bool bVal = XDocument.Load(Applicati

我有一个xml文件,比如

 <Root>
   <Child Name="A" />
 </Root>
如果xml类似于

<Root>
  <Child Name="A" val ="2" />
</Root>

但如果xml不包含“val”属性,则会引发异常


如何修改上述表达式(查询)以检查“val”属性的存在。

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

bool bVal = XDocument.Load(Application.StartupPath+"\\foo.xml")
                     .Descendants("Child")
                     .Select(x => (int?) x.Attribute("val"))
                     .FirstOrDefault(x => x != null) > 0;
这使用了三个功能:

  • 如果属性不存在,将
    XAttribute
    转换为
    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);

在本例中,我将该查询重写为:

bool bVal = XDocument.Load(Application.StartupPath+"\\foo.xml")
                     .Descendants("Child")
                     .Select(x => (int?) x.Attribute("val"))
                     .FirstOrDefault(x => x != null) > 0;
这使用了三个功能:

  • 如果属性不存在,将
    XAttribute
    转换为
    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);