10
votes

Utilisation de Linq et XDocument, puis-je obtenir tous les éléments enfants sous la balise parent?

J'ai un XML

XDocument XMLDoc = XDocument.Load("testdata.xml");
XElement accounts = (from xml2 in XMLDoc.Descendants("summary")
                    select xml2).FirstOrDefault();


3 commentaires

Vous devriez vérifier Linqpad, il vous permet de tester ce genre de chose à la volée. c'est soigné. :)


Écrire à partir de x in ... SELECT X est inutile. Écrivez simplement le code après dans directement.


2svick, vous avez raison en fait .. je n'ai pas remarqué cela. J'ai mis à jour le code maintenant :) merci!


3 Réponses :


3
votes
var accountSummaryElems = 
   XMLDoc.Element("summary").Elements("account");
This gives you a collection of the account elements under the summary element. You can then iterate them to get the values.EDITED to use the same pattern you were; I call First() instead of FirstOrDefault() because that code won't run anyway if the "account" element is not found.Then you have the right idea with iterating over the collection returned.

3 commentaires

merci Andrew. Je suppose que je suis capable d'utiliser votre solution pour obtenir le résultat. Je modifie mon message d'origine. Apprécier si vous pouvez valider.


J'ai posté la solution .. Pouvez-vous vérifier. apprécier ton aide.


Vous avez la bonne idée; J'ai mis à jour ma réponse pour utiliser élément et elements au lieu de descendants , par réponse de robert.



23
votes

Vous devez utiliser la méthode éléments : xxx

ou, alternativement, xpathselectelements , lequel dans ce cas est plus simple: xxx

Dans ce cas, vous pouvez également utiliser descendants , comme Andrew Barber suggéré, mais en général, vous ne devriez en faire que lorsque vous voulez vraiment trouver tous les descendants avec un nom donné, et pas seulement des enfants immédiats. Sinon, votre code fait beaucoup de recherche qu'il n'a pas besoin de, et peut retourner des éléments que vous ne le souhaitez pas.


2 commentaires

Oh ... je n'avais même pas compris qu'il utilisait descendants plutôt que éléments !!!


Correction de ma réponse et +1 pour noter que; Descendants fonctionnerait dans ce cas, mais cela pourrait avoir de mauvais résultats s'il y avait d'autres éléments avec les mêmes noms ailleurs.



0
votes

Ceci renvoie des éléments enfants en tant que liste de chaînes peu importe la situation.

using System.Xml.Linq;
XDocument xmlDocument = XDocument.Load(fileName);


public List<string> FindChilds(string parentTag)
{
     return xmlDocument.Descendants().Where(x => x.Parent != null).Where(x => x.Parent.Name.ToString().Equals(parentTag)).Select(x => x.Name.ToString()).ToList();
}


0 commentaires