Meilleur LINQ-to-XML de requête pour sélectionner les nœuds basé sur les propriétés des nœuds descendants?
J'ai le document XML suivant:
<?xml version="1.0" encoding="UTF-8"?>
<FamilyTree>
<Parent name="Ken">
<Child name="Lorna">
<Grandchild name="Andrew"/>
<Grandchild name="Brian"/>
</Child>
<Child name="Mike">
<Grandchild name="Ann"/>
<Grandchild name="Beth"/>
</Child>
</Parent>
<Parent name="Norma">
<Child name="Owen">
<Grandchild name="Charles"/>
</Child>
<Child name="Peter">
<Grandchild name="Charlotte"/>
</Child>
</Parent>
<Parent name="Quinn">
<Child name="Robert">
<Grandchild name="Debbie"/>
<Grandchild name="Eric"/>
</Child>
<Child name="Susan">
<Grandchild name="Frank"/>
</Child>
</Parent>
<Parent name="Tom">
<Child name="Ursula">
<Grandchild name="George"/>
<Grandchild name="Harriet"/>
</Child>
<Child name="Victor">
<Grandchild name="Ian"/>
<Grandchild name="Juliet"/>
</Child>
</Parent>
</FamilyTree>
Je suis en train de sélectionner tous les "Parents" avec un Enfant qui a au moins deux enfants ("petit-fils") de son/sa propre. Notez que je suis pas la recherche pour "Parents" avec au moins deux "petit-fils[ren]".
La suite d'une requête LINQ fonctionne, mais j'ai le sentiment que ça n'est pas la plus élégante.
IEnumerable<XElement> parents = (from c in familyTreeElement.Descendants("Child")
where c.Elements().Count() > 1
select c.Parent).Distinct();
Est-il une meilleure façon de préciser ce?
Premier commentaire - c'est de vérifier pour au moins deux enfants...
Je vous remercie. J'ai corrigé la faute de frappe. Je n'ai en effet voulons vérifier au moins deux enfants.
Je vous remercie. J'ai corrigé la faute de frappe. Je n'ai en effet voulons vérifier au moins deux enfants.
OriginalL'auteur Gayle | 2009-04-24
Vous devez vous connecter pour publier un commentaire.
Ahh le modifier (2 petits-enfants) aide ;-p
Tout
XDocument
est utile, parfois je m'ennuie de XPath/XQuery. AvecXmlDocument
vous pouvez simplement utiliserdoc.DocumentElement.SelectNodes("Parent[Child/Grandchild[2]]")
.Oui, désolé. Fautes de frappe. Pensais trop dur lorsque vous essayez d'expliquer tout cela.
vrai, vrai - j'ai de la cécité pour eux...
familyTreeElement.XPathSelectElements("Parent Enfant/petit-enfant[2]]"); semble fonctionner.
OriginalL'auteur Marc Gravell
Hmmm... j'ai du mal à obtenir ma tête autour d'elle exactement 🙂
Normalement pour savoir si il y a tout éléments, je ne l'utiliserais
Any
- mais vous voulez voir si il y a au moins deux éléments. On n'a pas besoin d'utiliserCount
bien que - parce que la présence d'au moins deux éléments est le même que le saut d'un élément et de voir si il y a encore des. Alors...Je pense que les œuvres - et en fait il n'a pas lu trop mal:
Pour chaque parent, de voir si tout de leurs enfants a tout (petits -) enfants après avoir ignoré le premier (grand)enfant.
Je soupçonne l'aide de XPath (selon la réponse de Marc) serait la plus lisible option si.
Je n'y avais pas pensé avant, mais c'est exactement la façon dont nous aimerions faire comme les humains. Si on nous a demandé de faire sûr qu'il y avait au moins une dizaine de biscuits dans une boîte de conserve, nous avions seulement de se pencher sur les dix premiers que nous avons vu 🙂
OriginalL'auteur Jon Skeet
Je ne connais pas le "SQL-like" la syntaxe est assez pour vous garantir que je vais obtenir la syntaxe à droite, si je l'écrire de cette façon, mais que vous souhaitez utiliser
.Any()
au lieu de.Count()
, et si vous sélectionnez une manière différente, vous n'avez pas besoin de laDistinct()
à la fin. Essayez ceci:EDIT: Si vous voulez vous assurer qu'il y a au moins 2, vous ne devez utiliser
.Count()
.OriginalL'auteur mquander