2010-05-11 4 views
1

Voici les grandes lignes XML:Quering XElements pour les enfants avec les enfants attributs

<Root> 
    <Thing att="11">  
    <Child lang="e"> 
     <record></record> 
     <record></record> 
     <record></record> 
    </Child > 
    <Child lang="f"> 
     <record></record> 
     <record></record>     
     <record></record> 
    </Child > 
</Thing> 
</Root> 

Je donne les résultats suivants:

TextReader reader = new StreamReader(Assembly.GetExecutingAssembly() 
       .GetManifestResourceStream(FileName)); 

    var data = XElement.Load(reader); 
foreach (XElement single in Data.Elements()) 
{ 
     // english records 
     var EnglishSet = (from e in single.Elements("Child") 
     where e.Attribute("lang").Equals("e") 
     select e.Value).FirstOrDefault(); 
} 

Mais Je reviens rien. Je veux être capable de Pour chaque "Chose" sélectionnez le "Enfant" où l'attribut "lang" est égal à une valeur. J'ai également essayé ceci, qui n'a pas fonctionné.

var FrenchSet = single.Elements("Child") 
.Where(y => y.Attribute("lang").Equals("f")) 
.Select(x => x.Value).FirstOrDefault(); 

Répondre

2

Vous vérifiez si l'objet est égal XAttribute à la chaîne "e".
Puisqu'un objet XAttribute n'est jamais égal à une chaîne, cela ne fonctionne pas.

Vous devez vérifier Value de l'objet XAttribute, comme ceci:

where y => y.Attribute("lang").Value == "e" 
+0

+1 pour plus rapide que moi de 2 minutes, mais vous n'avez pas mentionné le deuxième point que j'ai (et Stephan aussi). –

+0

Merci. Je savais que c'était quelque chose de petit. Est toujours. Quel format est le meilleur à utiliser: Basé sur une méthode ou basé sur une requête? – Arnej65

+1

@ Arnej65 La requête est traduite en méthodes par le compilateur, donc utilisez la méthode over-over la plus facile à lire. – Stephan

1

Vous comparez l'objet d'attribut avec la chaîne « e », plutôt que la valeur de l'objet attrbute. Vous renvoyez également la valeur du noeud plutôt que le noeud. Puisque la valeur est vide, vous obtiendrez simplement la chaîne vide.

Essayez ceci:

var EnglishSet = (from e in single.Elements("Child") 
        where e.Attribute("lang").Value == "e" 
        select e).FirstOrDefault(); 
1
var EnglishSet = (from e in single.Elements("Child") 
     where e.Attribute("lang").Value.Equals("e") 
     select e).FirstOrDefault(); 

Comme Slaks a déclaré que vous vérifiez que la valeur attribut est pas était "e". Vous n'avez pas non plus besoin de select e.Value parce que les nœuds "enfants" n'ont pas de valeur, ils ont des enfants "record".

+0

True true. Je reçois toutes les données dans "record" et pas les nœuds. – Arnej65

Questions connexes