61 votes

Sélection XPath par innertext

J'essaie d'extraire un élément avec un innertext particulier d'un document XML analysé. Je sais que je peux sélectionner un élément dont l'un des enfants possède un innertext particulier en utilisant la méthode suivante //myparent[mychild='foo'] mais je ne veux en fait sélectionner que l'élément "mychild" dans cet exemple.

<myparent>
  <mychild>
    foo
  </mychild>
</myparent>

Quelle serait la requête XPath pour " foo " qui renverrait le nœud " mychild " ?

95voto

GhiOm Points 13732

Avez-vous essayé ?

//myparent/mychild[text() = 'foo']

Alternativement, vous pouvez utiliser le raccourci de la fonction self axe :

//myparent/mychild[. = 'foo']

5 votes

Ou //myparent[mychild = 'foo']

0 votes

@subtenante : Merci, c'est exactement ce dont j'avais besoin.

3 votes

@Matt : si OP veut sélectionner l'élément mychild, alors votre solution ne fonctionnera pas, elle sélectionnera l'élément myparent.

5voto

Pål Thingbø Points 101

Matt l'a dit, mais la solution complète :

//myparent[mychild='foo']/mychild

0 votes

Il recherche tous les noeuds enfants de "monparent" où tout "monenfant" de "monparent" a "foo" comme texte interne.

3voto

Vous pouvez envisager d'utiliser le contains pour retourner vrai/faux si le test a été trouvé comme ceci :

//mychild[contains(text(),'foo')]

Véase Fonctions XSLT, XPath et XQuery pour les fonctions de référence

0voto

New contributor Points 31198

Selon le HTML :

<myparent>
  <mychild>
    foo
  </mychild>
</myparent>

En <mychild> avec le texte comme foo est dans son parent <myparent> et le texte contient leader y suivi de espace blanc des personnages.

Ainsi, pour sélectionner le <mychild> vous pouvez utiliser l'une des solutions suivantes :

  • Utilisation de normalize-space() :

    //myparent/mychild[normalize-space()='foo']
  • Utilisation de contains() :

    //myparent/mychild[contains(., 'foo')]

Ignorer le parent <myparent> que vous pouvez également utiliser :

  • Utilisation de normalize-space() :

    //mychild[normalize-space()='foo']
  • Utilisation de contains() :

    //mychild[contains(., 'foo')]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X