2010-11-17 4 views
0

Bonjour, Je viens de plonger dans LINQ-XML il y a quelques jours et je voudrais savoir si je fais quelque chose de mal ou que ce n'est pas possible de le faire. J'ai cherché partout et il n'y a pas eu de problème lié au mien et je me suis un peu balancé maintenant.sélection des éléments enfants enfants avec linq

XML:

<catalog> 
<product description="Cardigan Sweater" product_image="cardigan.jpg"> 
<catalog_item gender="Men's"> 
    <item_number>QWZ5671</item_number> 
    <price>39.95</price> 
    <size description="Medium"> 
    <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
    <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
    </size> 
    <size description="Large"> 
    <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
    <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
    </size> 
</catalog_item> 
<catalog_item gender="Women's"> 
    <item_number>RRX9856</item_number> 
    <price>42.50</price> 
    <size description="Small"> 
    <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
    <color_swatch image="navy_cardigan.jpg">Navy</color_swatch> 
    <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
    </size> 
    <size description="Medium"> 
    <color_swatch image="red_cardigan.jpg">Red</color_swatch> 
    <color_swatch image="navy_cardigan.jpg">Navy</color_swatch> 
    <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
    <color_swatch image="black_cardigan.jpg">Black</color_swatch> 
    </size> 
    <size description="Large"> 
    <color_swatch image="navy_cardigan.jpg">Navy</color_swatch> 
    <color_swatch image="black_cardigan.jpg">Black</color_swatch> 
    </size> 
    <size description="Extra Large"> 
    <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch> 
    <color_swatch image="black_cardigan.jpg">Black</color_swatch> 
    </size> 
</catalog_item> 

et la requête:

 var query = 
     from size in 
      (
       from catalogItem in cardigan.Descendants("catalog_item") 
       where catalogItem.Attribute("gender").Value == "Men's" 
       select catalogItem.Descendants("size") 
      ) 
     select size.Elements("color_swatch"); 

qui me fait essentiellement tous les color_swatch pour pour hommes mais j'ai essayé de voir si je peux obtenir tous les color_swatch pour les hommes seulement.

Merci d'avance.

Répondre

0

changer simplement votre requête à

var query = 
    from size in 
     (
      from catalogItem in cardigan.Descendants("catalog_item") 
      where catalogItem.Attribute("gender").Value == "Men's" 
      select catalogItem.Descendants("size") 
     ) 
    where size.Attribute("description") == "Large" 
    select size.Elements("color_swatch"); 

Cela fonctionne parce que vous obtenez d'abord tous les éléments « Taille » qui s'appliquent pour les hommes, puis de cette liste il filtre les saisir que les « grands ».

+0

Vous voulez dire 'size.Attribute', pas' size.Attributes'. – cdhowie

+0

Merci, corrigé la faute de frappe –

+0

Voir le problème est que la taille est un IEnumerable pas un XElement, donc il n'a pas de définition pour l'attribut. J'ai déjà essayé ceci :( – David

0

ok donc je Mucked autour un peu plus ... et je l'ai eu ...

var query =   
from catalogItem in cardigan.Descendants("catalog_item") 
where catalogItem.Attribute("gender").Value == "Men's" 
from size in catalogItem.Descendants("size") 
where size.Attribute("description").Value == "Large" 
select size.Elements("color_swatch"); 

dépenser environ 8 heures, mais je l'ai eu !!

Je suis allé et j'ai essentiellement quelques échantillons de xml complexes à manipuler. Je suppose que c'est comme ça que tu apprends. :)

merci les gars :)

Questions connexes