2010-02-02 9 views
2

Ceci est mon idée pour le code (la requête Linq peut-elle remplir directement l'objet dictionnaire?).Comment faire une itération sur un ensemble de résultats d'élément XML à partir d'une requête Linq

XElement doc = XElement.Load(data.xml); 
string Element = "KeyNode"; 
string SearchString = "Dominion"; 
Dictionary<string, string> QueryData = new Dictionary<string, string>(); 

var query = from child in doc.Descendants(Element) 
      where SearchString == child.Value 
      select pn.Parent.Elements(); 


foreach(XElement x in query) 
{ 
    QueryData.Add(x.Name.ToString(),x.Value); 
} 

Répondre

1

Je ferais cela pour créer le dictionnaire:

var queryData = query.ToDictionary(x => x.Name.ToString(), x => x.Value); 

Cependant, c'est seulement sûr si vous savez que votre XML n'a pas de noms en double. S'il peut contenir des noms en double, vous pouvez obtenir une liste distincte dans votre requête, ou rechercher ToLookup() comme alternative à ToDictionary().

En outre, votre code stocke le nom du tag en tant que clé du dictionnaire. Si c'est ce dont tu as besoin, alors c'est génial. Mais si vous avez réellement besoin de la valeur d'un attribut d'étiquette ou quelque chose comme ça, alors vous devrez changer votre code.

Mise à jour

Je pense que je vois ce que le problème est. Vous n'avez jamais indiqué quelle est votre difficulté à répéter les résultats, mais je pense que cela pourrait être le cas:

La méthode Elements() renvoie IEnumerable<XElement>. Cela signifie que le type de votre variable query est actuellement IEnumerable<IEnumerable<XElement>>. Si vous voulez aplatir cela à une seule liste de tous les éléments, voici comment:

var flattened = query.SelectMany(x => x); 
+0

Merci pour la partie du dictionnaire, mais pour l'essayer, j'ai besoin d'itérer le résultat initial. – Zion

+0

C'est tout! les rebelles sont là et je suis sûr que Skywalker est avec eux! Merci beaucoup, l'aplatissement a fait l'affaire. Si vous pouvez expliquer s'il vous plaît pourquoi mon resultset a donné des ienumerables imbriqués? – Zion

+0

Imaginez que votre instruction select était 'select child.Name.ToString()'. Vous obtiendrez un 'IEnumerable '. Votre véritable instruction select renvoie une séquence d'éléments (tous les enfants du parent). Puisque le résultat final d'une requête est une séquence des valeurs produites par chaque appel à l'instruction select, et chaque instruction select renvoie une séquence d'éléments, vous vous retrouvez avec une séquence d'une séquence d'éléments. –

Questions connexes