2010-09-13 49 views
1

我遇到像如何使用LINQ到XML在C#

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

我需要檢查的「孩子」的元素是否有一個XML文件,檢查屬性的存在中的XDocument「VAL」 attribute.if是的,如果該值大於零,則需要將布爾變量的值更改爲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」屬性的存在。

回答

6

在這種情況下,我會重寫查詢爲:

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

它使用三個特點:

  • 轉換XAttributeint?代替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); 
+0

@ Jon Skeet:謝謝.. :-) – 2010-09-13 09:04:00