7
votes

Comment trouver tous les nœuds d'un type spécifique dans XPATH

permet de dire que j'ai l'instance de données de formulaire suivante dans mon point de vue.xml: xxx

Je souhaite sélectionner tous les noms de fruits de l'instance ci-dessus. J'ai essayé les manières suivantes, mais elle sélectionne toujours le premier fruit. xxx

Veuillez fournir un moyen de surmonter cela dans XPATH


2 commentaires

À côté des deux expressions sont verboses et ils ne pourraient être que instance ('instangeta') / fruits / fruits / noms de fruits , si une expression entraîne tous les nœuds sélectionnés ou tout simplement le premier dépend de La méthode du moteur XPath spécifique utilisée.


Je sais que c'est vieux, mais personne n'a noté que la déclaration d'espace de noms est "XXForms" et ne correspond pas à l'espace de noms "XForms"?


3 Réponses :


14
votes

Essayez ceci xxx

Il trouvera tous les noms de fruits où qu'ils se trouvent dans la hiérarchie du document.


4 commentaires

@Furgan: Démarrage // n'est pas une bonne pratique lorsque le schéma est bien connu.


@Alejandro, c'est une généralisation qui n'est pas toujours correcte. Si une implémentation de XPath comporte un index des éléments à sa disposition (comme la base de données existante), écrire // nom de fruit sera effectivement plus rapide! En outre, exécutant // nom de fruit sur une petite instance comme celle-ci ne fera probablement pas la différence. La réalité est que l'expression est "meilleure" dépend de quelques facteurs.


@ebruze: Tout d'abord, ce n'est pas une bonne pratique. Deuxièmement, je n'ai pas dit qu'un chemin complet serait toujours plus rapide. Mais outre les optimisations de la mise en œuvre, le problème est dans la complexité: Descefant Axis traversera l'ensemble de l'arbre de descente, même après avoir trouvé un match. De plus, la puissance d'expression de la langue peut facilement casser toute optimisation. Penser dans (.) [$ Complex-condition] // élément .


@Alejandro: Il ne suffit pas de dire que quelque chose n'est pas une bonne pratique. Il doit y avoir une justification derrière elle. Un bon optimiseur XPath travaillant avec un indice n'a pas besoin de traverser un arbre, une période. Et si ce que vous voulez vraiment exprimer est "Trouver tous les nom de fruit " dans un document, puis écrivez // nom de fruit exprime exactement cela.



0
votes

premier: Il peut s'agir d'une faute de frappe n'importe quel moyen de vous indiquer que XML a un mauvais nœud finissant xxx p> secondaire: Votre XPath est très valide mais lorsque vous l'analysez que vous devez itérer sur le résultat défini comme étant comme une séquence de nœud et non une valeur unique.

Dans vos xForms, vous devez itérer sur les Resultats pour obtenir la liste des fruits.

Si vous ne voulez que des noms de fruits, vous pouvez essayer xxx


0 commentaires

4
votes

Si vous souhaitez sélectionner tous les code> à partir de l'instance instangehata ​​code> ( code "> code >) Cela ressemble à celui que vous avez dans votre question, vous devez le faire:

<xforms:instance xmlns="" id="instanceData">


2 commentaires

J'ai édité ma question avec la vue correcte.xml. Je n'ai pas utilisé l'espace de noms par défaut. Mais toujours ça ne marche pas.


@Thangamani, si cela ne fonctionne pas, je suppose que cela est dû à la façon dont vous utilisez cette expression. Voir ici un exemple complet qui montre tous les fruits: Gist.github.com/859678