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.
"a un descendant nommé interestintag" est orthographié .//interestintag
dans XPath. L’expression que vous recherchez est donc:
//table[@name='important']/tr[.//interestingtag]
En fait, vous devez rechercher un descendant, pas un enfant:
//table[@name='important']/tr[descendant::interestingtag]
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']]
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