XPath per selezionare l'elemento in base al valore dell'attributo


195

Ho seguito XML.

<?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>

Voglio selezionare l'elemento Employee con id = "4".

Sto usando sotto l'espressione XPath che non restituisce nulla.

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

L'ho controllato su http://chris.photobooks.com/xml/default.htm e dice xpath non valido, non sono sicuro di dove sia il problema.

Risposte:


278

È necessario rimuovere /prima il [. I predicati (le parti in [ ]) non dovrebbero avere barre immediatamente davanti a loro. Inoltre, per selezionare l'elemento Employee stesso, dovresti lasciarlo /text()alla fine o altrimenti dovresti semplicemente selezionare i valori del testo degli spazi bianchi immediatamente sotto l'elemento Employee.

//Employee[@id='4']

Modifica: come sottolinea Jens nei commenti, //può essere molto lento perché cerca in tutto il documento i nodi corrispondenti. Se la struttura dei documenti con cui stai lavorando sarà coerente, probabilmente è meglio utilizzare un percorso completo, ad esempio:

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

3
Nota che //seleziona e cerca su tutti i nodi del documento che possono essere lenti. Invece, se si conosce la struttura del documento, utilizzare un percorso corretto, come suggerito nella risposta di Gilles di seguito.
Jens,

@Jens Sì, è assolutamente vero. Ho modificato la mia risposta per aggiungere un addendum.
JLRishe,

13

Come seguito, è possibile selezionare "tutti i nodi con un attributo particolare" come questo:

//*[@id='4']

12

Prova a fare questo:

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

xmllint carica l'intero file xml in memoria prima di cercare gli id ​​?. Ho un file xml da 46 GB e sto cercando id in esso
Hani Goc

file xml da 46 GB - c'è il problema.
Gurwinder Singh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.