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.

Pankaj
la source

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']
JLRishe
la source
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']
rogerdpack
la source
12

Essayez de faire ceci:

/Employees/Employee[@id=4]/*/text()
Gilles Quenot
la source
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