Question

Est-il possible d’utiliser XPath pour sélectionner uniquement les nœuds ayant un élément enfant particulier? Par exemple, à partir de ce XML, je ne veux que les éléments des animaux de compagnie qui ont un enfant de 'bar'. Ainsi, l'ensemble de données résultant contiendrait les éléments lizard et pig de cet exemple:

<pets>
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog>
   <foo>not this one either</foo>
  </dog>
  <lizard>
   <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig>
   <bar>return pig, too</bar>
  </pig>
</pets>

Ce Xpath me donne tous les animaux: "/ pets / *" , mais je ne veux que les animaux qui ont un nœud enfant de nom 'bar' .

Était-ce utile?

La solution

Le voici dans toute sa splendeur

/pets/*[bar]

Français: donnez-moi tous les enfants de animaux de compagnie qui ont une barre d'enfants

Autres conseils

/pets/child::*[child::bar]

Désolé, je n'ai pas vu les commentaires de la réponse précédente.

Mais dans ce cas, je préférerais utiliser l'axe descendant :: , qui inclut tous les éléments à partir de celui spécifié:

/pets[descendant::bar]

Juste au cas où vous voudriez être plus précis sur les enfants - vous pouvez également utiliser des sélecteurs sur eux.

Exemple:

<pets>
    <cat>
        <foo>don't care about this</foo>
    </cat>
    <dog>
        <foo>not this one either</foo>
    </dog>
    <lizard>
        <bar att="baz">lizard should be returned, because it has a child of bar</bar>
    </lizard>
    <pig>
        <bar>don't return pig - it has no att=bar </bar>
    </pig>
</pets>

Désormais, vous ne vous souciez que de tous les animaux ayant une barre enfant ayant un attribut att avec la valeur baz . Vous pouvez utiliser l'expression xpath suivante:

//pets/*[descendant::bar[@att='baz']]

Résultat

<lizard>
    <bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top