web-dev-qa-db-fra.com

Requête Xpath pour trouver des éléments contenant un certain descendant

J'utilise Html Agility Pack pour exécuter des requêtes xpath sur une page Web. Je veux trouver les lignes dans une table qui contiennent un certain élément intéressant. Dans l'exemple ci-dessous, je souhaite récupérer la deuxième ligne.

<table name="important">
<tr>
  <td>Stuff I'm NOT interested in</td>
</tr>
<tr>
  <td>Stuff I'm interested in</td>
  <td><interestingtag/></td>
  <td>More stuff I'm interested in</td>
</tr>
<tr>
  <td>Stuff I'm NOT interested in</td>
</tr>
<tr>
  <td>Stuff I'm NOT interested in</td>
</tr>
</table>

Je cherche à faire quelque chose comme ça:

//table[@name='important']/tr[has a descendant named interestingtag]

Sauf avec une syntaxe xpath valide. ;-)

Je suppose que je pourrais simplement trouver l’élément intéressant lui-même et remonter ensuite dans la chaîne parente à partir du nœud qui est renvoyé, mais il me semblait qu’il devrait exister un moyen de le faire en une seule étape et je suis simplement dense.

32
Jeremy Stein

"a un descendant nommé interestintag" est orthographié .//interestintag dans XPath. L’expression que vous recherchez est donc: 

//table[@name='important']/tr[.//interestingtag]
50
mirod

En fait, vous devez rechercher un descendant, pas un enfant:

//table[@name='important']/tr[descendant::interestingtag]
19
Scott Baker

Je sais que ce n’est pas ce que demandait le PO, mais si vous vouliez trouver un élément ayant un descendant avec un attribut particulier , vous pourriez faire quelque chose comme ceci:

//table[@name='important']/tr[.//*[@attr='value']]
8
Tony Wickham

Je sais que c'est une réponse tardive, mais pourquoi ne pas faire l'inverse. Recherchez toutes les balises <interestingtag/>, puis sélectionnez la balise parent <tr>.

//interestingtag/ancestor::tr
0
keocra