2012-03-06 8 views
0

次のXMLでは、<category domain="Portal Sub" value="Events">ノードに子要素がある項目のみを返します。linq to xml特定の要素を持つノードのみを選択します。

次のコードを試しましたが、それでもすべてのノードが返されます。 子ノードが存在するアイテムだけを取得する方法がわからないので、助けてください。

<item guid="123"> 
    <title>test1</title> 
     <category domain="Target">Business Decision Makers</category> 
     <category domain="Target">Individual Customers</category> 
     <category domain="Target">IT Decision Makers</category> 
     <category domain="Portal" value="IT Network"> 
      <category domain="Portal Sub" value="Events"> 
       <category domain="Portal Sub" value="Forum" /> 
      </category> 
     </category> 
    </item> 
    <item guid="456"> 
    <title>test2</title> 
     <category domain="Target">IT managers</category> 
     <category domain="Target">IT Professional</category> 
     <category domain="Portal" value="IT Network"> 
      <category domain="Portal Sub" value="Events" /> 
     </category> 
    </item> 





var getFilteredItems = (from item in xdoc.Descendants("item") 
          where item.Descendants("category").Descendants("category").Any() 
          select new 
          { 
            etype = (from x in item.Elements("category").Elements("category") 
              where x.Attribute("value").Value == "Events" 
              select new 
              { 
               cctype = x.Descendants("category").Select(i => i.Attribute("value").Value ?? "") 
              }).First() 

          }).ToList(); 

答えて

1
from item in xdoc.Descendants("item") 
where item.Descendants("category").Any(c => (string)c.Attribute("domain") == "Portal" 
    && (string)c.Attribute("value") == "Events" && c.Elements().Any()) 
select ... 
+0

おかげでマーティンは、完全に働きました。私は属性値で周りを回ったが、Elements.Any部分を見逃してしまった。クイックヘルプをありがとう! –

関連する問題