Recherche…


Trouver tous les éléments avec un certain texte

Imaginez le XML suivant:

<root>
    <element>hello</element>
    <another>
        hello
    </another>
    <example>Hello, <nested> I am an example </nested>.</example>
</root>

L'expression XPath suivante:

//*[text() = 'hello']

renverra l' <element>hello</element> , mais pas l'élément <another> . C'est parce que l'élément <another> contient des espaces blancs entourant le texte hello .

Pour récupérer à la fois <element> et <another> , on pourrait utiliser:

//*[normalize-space(text()) = 'hello']

ou

//*[normalize-space() = 'hello']

qui va couper les espaces blancs avant de faire la comparaison. Ici, nous pouvons voir que le spécificateur de noeud text() est facultatif lors de l'utilisation normalize-space .

Pour trouver un élément contenant un texte spécifique, vous pouvez utiliser la fonction contains . L'expression suivante retournera l'élément <example> :

//example[contains(text(), 'Hello')]

Si vous souhaitez rechercher du texte couvrant plusieurs enfants / noeuds de texte, vous pouvez utiliser . au lieu de text() . . fait référence à l'intégralité du contenu textuel de l'élément et à ses enfants.

//example[. = 'Hello,  I am an example .']

Pour voir les différents nœuds de texte, vous pouvez utiliser:

//example//text()

qui reviendra:

  • "Bonjour, "
  • "Je suis un exemple"
  • "."

Et pour voir plus clairement tout le contenu textuel d'un élément, on peut utiliser la fonction string :

string(//example[1])

ou juste

string(//example)

Bonjour, je suis un exemple.

Ce dernier fonctionne car, si un ensemble de nœuds est passé dans des fonctions telles que des string , XPath 1.0 se contente d'examiner le premier nœud (dans l'ordre des documents) dans cet ensemble de nœuds et ignore le reste.

alors:

string(/root/*)

retournerais:

Bonjour



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow