xpath obtenir les dernières spécifiques précédent-frère
Voici quelque chose de vraiment simple (du moins je suppose), je n'arrive pas à obtenir la moindre idée.
Je dois analyser un grand document XML pour obtenir un nœud spécifique, identifié par l'un de ses sous-nœud valeurs. C'est facile jusqu'à présent. Mais quand j'essaie de l'analyser à partir de ce nœud relativement à la hausse, en sélectionnant le précédent,-les frères et sœurs de son ancêtre à l'aide d'un prédicat-je obtenir une liste de nœuds, à partir de ce que j'ai à marcher de nouveau à la baisse.
En Theorie, qui est un tableau, avec 5 colonnes et deux lignes (dans l'exemple montré ci-dessous). J'ai juste l'id de l'élément d'un champ, et il faut trouver le nom donné dans le premier champ de la ligne. Le premier champ est toujours de type "Lien" et a un nom de sous-nœud avec le texte - qui est la chose à faire.
En d'autres termes, j'ai besoin de se déplacer à partir de n'importe quel nœud avec un <id>XXX_X</i>
à la prochaine précédent-frère de la cellule avec un contrôle de xsi:type='Label'
et un nom de nœud. À partir du nœud <id>MyItemId_1</>
j'ai besoin d'obtenir la seconde précédente-sœur, à partir du nœud <id>MyItemId_4</id>
j'ai besoin d'obtenir la 5ème précédent-frère.
Ceci est un exemple de xml pièce:
<cell>
<control xsi:type="Label">
<id>1234</id>
<name>MyOtherItemName</name>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyOtherItemId_0</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyOtherItemId_1</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyOtherItemId_2</id>
<name>552</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyOtherItemId_3</id>
<name>432</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyOtherItemId_4</id>
<name>33</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>1234</id>
<name>MyItemName</name>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyItemId_0</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Label">
<id>MyItemId_1</id>
<name/>
<message/>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyItemId_2</id>
<name>552</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyItemId_3</id>
<name>432</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
<cell>
<control xsi:type="Button">
<id>MyItemId_4</id>
<name>33</name>
<message/>
<type>Link</type>
<selected>false</selected>
</control>
<selected>false</selected>
<style>Odd</style>
</cell>
Je ne obtenez le point que je dois obtenir avec ce xpath:
//cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id
Qui sélectionne l'id de la commande de la cellule, à savoir la 4ème colonne de la deuxième ligne de la table.
À partir de ce nœud sur j'ai essayer de passer à la première cellule de la ligne en suivant ce chemin:
../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name
Qui me donne les deux corriger des cellules de la première colonne de la table.
<name>MyOtherItemName</name>
* * * * * * * * * *
<name>MyItemName</name>
Maintenant, il me brise le dos puisque je ne peux pas le faire juste me donner la dernière l'un des deux.
J'ai essayé ceci:
../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]][1]/control[name[node()]]/name
qui est un précédent-frère de sélection avec un prédicat exactement le genre de frères et sœurs que je recherche, mais il semble que je ne peut pas la combiner prédicat avec un [1] sélecteur. Au lieu de sélectionner le premier de votre choix précédent frère "MyItemName" il sélectionne le premier de la fratrie de tous les précédents "MyOtherItemName".
J'ai besoin d'aide, j'espère que quelqu'un ici a une idée et peut repérer les moi dans la bonne direction.
Exactement ce que j'ai mis en place pour obtenir ce travail est de copier les données xml dans http://www.bit-101.com/xpath/
et de travailler avec la concaténation de xpathes sur elle pour simuler ce que le logiciel doit faire:
//cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id/../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name
- Si vous essayez de sélectionner
MyItemName
? Comment est-ce que la première cellule de la ligne? C'est sûr qu'il ne ressemble pas à elle. - Je l'ai perdu quelque part entre le tableau à 5 colonnes et le premier champ de type Lien. Pensez-vous que vous pouvez reformuler vos exigences, sans la table analogie?
- D'accord avec @quarante-deux. Il est souvent bon de montrer ce que vous avez essayé, donc je vous remercie pour ce travail, mais dans ce cas la qu'est-ce-que j'ai essayé qui occulte les originaux de vos exigences. Vous avez oublié de nous dire exactement et précisément ce que vous essayiez de faire en premier lieu.
- Je vous remercie pour vos pensées. @iwburk, c'est la première cellule d'une ligne, mais seulement après avoir rendu, le xml lui-même n'a pas vraiment d'ou clairement état. Mais la combinaison de xsi:type='Label' et le nom de nœud avec du texte est exactement le modèle que le logiciel qui rend la cellule de la première colonne de la ligne.
- J'ai essayé le xpath avec bit-101.com/xpath ainsi qu'avec le logiciel que j'utilise. Dans les deux cas, l'ajout d' "[1]" à la précédente-frère me donne la de mal sur les deux sélectionnés.
- Donc, j'ai essayé d'être plus clair, exactement ce dont j'ai besoin dans le troisième paragraphe de la question, sans la table analogie.
Vous devez vous connecter pour publier un commentaire.
Je ne comprends pas quel est le problème exactement, mais qui précèdent les frères et sœurs sont triés à partir du nœud lui-même vers le début du document, c'est à dire à l'inverse que dans le document. Pour obtenir la plus proche de la précédente, une sœur, l'utilisation
preceding-sibling[1]
, pour obtenir le plus d'un (c'est à dire la première dans l'ordre du document), l'utilisationpreceding-sibling[last()]
.preceding-sibling::*[PREDICATE][1]
(pour moi).Après la lecture de votre mise à jour, ne serait-ce pas le travail:
Je suis un peu largué sur le nom d'un nœud: voulez-vous tester l'existence de texte dans le nom de nœud ou tout simplement l'existence du nom du nœud lui-même?
YourWebElement.FindElement(Par.XPath("précédent-frère::*[1]"));
Ici 1 indique seulement le frère au-dessus du nœud sélectionné et ensuite vous pouvez faire de la récursivité afin d'obtenir tous les précédents, les frères et sœurs du bas vers le haut.