2012-09-11 39 views
2

我有以下XML結構:的LINQ to XML:獲取包含某些兒童的所有節點

<Capabilities> 
    <Capability ID="1" Name="Capability # 1"> 
     <Relations> 
      <Relation RelatedTo="2" RelationType="Child"/> 
      <Relation RelatedTo="3" RelationType="Child"/> 
      <Relation RelatedTo="4" RelationType="Child"/> 
      <Relation RelatedTo="5" RelationType="Child"/> 
     </Relations> 
    </Capability> 
    <Capability ID="3" Name="Capability # 3"> 
     <Relations> 
      <Relation RelatedTo="1" RelationType="Dependant" /> 
     </Relations> 
    </Capability> 
    <Capability ID="2" Name="Capability # 2"> 
     <Relations> 
      <Relation RelatedTo="6" RelationType="Child" /> 
      <Relation RelatedTo="5" RelationType="Child" /> 
     </Relations> 
    </Capability> 
</Capabilities> 

,我需要查詢與同5 所以價值願意與我們屬性的子關係的所有功能遠我已經嘗試了以下查詢,但我收到了'空引用異常'的集合,我無法弄清楚如何做到這一點。

var result = root.Elements("Capability") 
       .Where(c => c.Elements("Relations") 
          .Where(r => r.Attribute("RelatedTo").Value == "5" 
           && r.Attribute("").Value == Enum.GetName(typeof(RelationTypes), RelationTypes.Children)).Any()); 

我在做什麼錯的任何線索或什麼是正確的方式來查詢它?

回答

4
var capabilites = root.Descendants("Capability") 
      .Where(c => c.Descendants("Relation") 
         .Any(r => (string)r.Attribute("RelatedTo") == "5")) 
      .ToList(); 
+1

感謝這就是我一直在尋找。 –

1

這樣的:在

var xDoc = XDocument.Parse(
@"<Capabilities> 
<Capability ID=""1"" Name=""Capability # 1""> 
     <Relations> 
      <Relation RelatedTo=""2"" RelationType=""Child""/> 
      <Relation RelatedTo=""3"" RelationType=""Child""/> 
      <Relation RelatedTo=""4"" RelationType=""Child""/> 
      <Relation RelatedTo=""5"" RelationType=""Related""/> 
     </Relations> 
    </Capability> 
    <Capability ID=""3"" Name=""Capability # 3""> 
     <Relations> 
      <Relation RelatedTo=""1"" RelationType=""Dependant"" /> 
     </Relations> 
    </Capability> 
    <Capability ID=""2"" Name=""Capability # 2""> 
     <Relations> 
      <Relation RelatedTo=""6"" RelationType=""Child"" /> 
      <Relation RelatedTo=""5"" RelationType=""Child"" /> 
     </Relations> 
    </Capability> 
</Capabilities>"); 

var q = xDoc.Descendants("Capability"). 
      Where(c => c.Descendants("Relation").Where(r => (int)r.Attribute("RelatedTo") == 5).Any()); 

foreach (var r in q) 
{ 
    Console.WriteLine(r); 
} 

結果:

<Capability ID="1" Name="Capability # 1"> 
    <Relations> 
    <Relation RelatedTo="2" RelationType="Child" /> 
    <Relation RelatedTo="3" RelationType="Child" /> 
    <Relation RelatedTo="4" RelationType="Child" /> 
    <Relation RelatedTo="5" RelationType="Related" /> 
    </Relations> 
</Capability> 
<Capability ID="2" Name="Capability # 2"> 
    <Relations> 
    <Relation RelatedTo="6" RelationType="Child" /> 
    <Relation RelatedTo="5" RelationType="Child" /> 
    </Relations> 
</Capability> 
Press any key to continue . . . 

這一點我認爲你是什麼後...

+0

這個答案也是正確的,我只是標記了第一個。謝謝!! –