【问题标题】:How to check the existence of Attribute in XDocument using LINQ to XML in C#如何在 C# 中使用 LINQ to XML 检查 XDocument 中是否存在属性
【发布时间】:2013-08-21 22:20:41
【问题描述】:

我有一个类似的 xml 文件

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

我需要检查“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;

如果 xml 像这样,这个表达式就可以正常工作

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

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

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

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

    这使用了三个功能:

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

    如果你想检查是否有任何个正值,那就更简单了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多