XPath pour sélectionner l'élément par valeur d'attribut


195

J'ai XML suivant.

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee>
    <Employee id="4">
        <age>25</age>
        <name>Meghna</name>
        <gender>Female</gender>
        <role>Manager</role>
    </Employee>
</Employees>

Je veux sélectionner l'élément Employee avec id = "4".

J'utilise ci-dessous l'expression XPath qui ne renvoie rien.

//Employee/[@id='4']/text()

Je l'ai vérifié sur http://chris.photobooks.com/xml/default.htm et il indique xpath invalide, je ne sais pas où est le problème.

Réponses:


278

Vous devez supprimer le fichier /avant le [. Les prédicats (les parties dans [ ]) ne doivent pas avoir de barres obliques immédiatement avant eux. De plus, pour sélectionner l'élément Employee lui-même, vous devez laisser le /text()à la fin, sinon vous ne sélectionneriez que les valeurs de texte d'espaces immédiatement sous l'élément Employee.

//Employee[@id='4']

Edit: Comme Jens le souligne dans les commentaires, cela //peut être très lent car il recherche dans tout le document les nœuds correspondants. Si la structure des documents avec lesquels vous travaillez doit être cohérente, il vaut probablement mieux utiliser un chemin complet, par exemple:

/Employees/Employee[@id='4']

3
Notez que //sélectionne et recherche sur tous les nœuds du document, ce qui peut être lent. Au lieu de cela, si la structure du document est connue, utilisez un chemin approprié, comme suggéré dans la réponse de Gilles ci-dessous.
Jens

@Jens Oui, c'est absolument vrai. J'ai modifié ma réponse pour ajouter un addendum.
JLRishe

13

Ensuite, vous pouvez sélectionner "tous les nœuds avec un attribut particulier" comme ceci:

//*[@id='4']

12

Essayez de faire ceci:

/Employees/Employee[@id=4]/*/text()

xmllint charge-t-il l'intégralité du fichier xml en mémoire avant de rechercher les identifiants ?. J'ai un fichier xml de 46 Go et je recherche des identifiants dedans
Hani Goc

xml de 46 Go - il y a le problème.
Gurwinder Singh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.