393 votes

XPath contains(text(), 'some string') ne fonctionne pas lorsqu'il est utilisé avec un nœud comportant plus d'un sous-nœud Texte

J'ai un petit problème avec XPath contains avec dom4j ...

Disons que mon XML est

<Home>
    <Addr>
        <Street>ABC</Street>
        <Number>5</Number>
        <Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
    </Addr>
</Home>

Disons que je veux trouver tous les noeuds qui ont ABC dans le texte donné à l'élément racine...

Donc le XPath que j'aurais besoin d'écrire serait

//*[contains(text(),'ABC')]

Cependant, ce n'est pas ce que renvoie dom4j ..... Est-ce un problème de dom4j ou une mauvaise compréhension du fonctionnement de XPath, puisque cette requête ne renvoie que l'élément Street et non l'élément Comment élément ?

Le DOM fait le Comment élément un élément composite avec quatre balises deux

[Text = 'XYZ'][BR][BR][Text = 'ABC'] 

Je suppose que la requête devrait toujours renvoyer l'élément puisqu'elle devrait trouver l'élément et exécuter contains sur lui, mais ce n'est pas le cas...

La requête suivante renvoie l'élément, mais elle renvoie bien plus que l'élément - elle renvoie également les éléments parents, ce qui n'est pas souhaitable pour le problème.

//*[contains(text(),'ABC')]

Est-ce que quelqu'un connaît la requête XPath qui renverrait seulement les éléments <Street/> y <Comment/> ?

0 votes

D'après ce que je sais, //*[contains(text(),'ABC')] ne renvoie que le <Street> élément. Elle ne renvoie pas d'ancêtres de <Street> o <Comment> .

5voto

user3520544 Points 105
//*[text()='ABC'] 

renvoie à

<street>ABC</street>
<comment>BLAH BLAH BLAH <br><br>ABC</comment>

2voto

billynoah Points 456

Voici une autre façon de faire correspondre les nœuds qui contiennent une chaîne de texte donnée. Il faut d'abord rechercher le nœud de texte lui-même, puis obtenir le parent :

//text()[contains(., "ABC")]/..

Pour moi, c'est facile à lire et à comprendre.

0voto

phuongauto Points 11

C'est la meilleure réponse à la question du sujet :

//*[text()[contains(.,'ABC')]]/text()[contains(.,"ABC")]

Un exemple : exemple de cas

Xpath pour obtenir bon dua madam

//h3[text()='Contact Information']/parent::div/following-sibling::div/p[text()[contains(.,'bon dua madam')]]/text()[contains(.,'bon dua madam')]

-1voto

zagoo2000 Points 63

Ça m'a pris un peu de temps, mais j'ai fini par comprendre. Un xpath personnalisé qui contient du texte ci-dessous a parfaitement fonctionné pour moi.

//a[contains(text(),'JB-')]

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