2013-01-09 24 views
143

Ho il seguente XML.XPath per selezionare Elemento in base al valore dell'attributo

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

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

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

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

ho controllato a http://chris.photobooks.com/xml/default.htm e si dice XPath non valida, non so dove sia il problema.

risposta

215

È necessario rimuovere / prima dello [. I predicati (le parti in []) non devono presentare barre immediatamente prima di esse. Inoltre, per selezionare l'elemento Employee stesso, è necessario lasciare il /text() alla fine o altrimenti si selezionerebbero i valori di testo degli spazi bianchi immediatamente sotto l'elemento Employee.

//Employee[@id='4'] 

Edit: Come Jens sottolinea nei commenti, // può essere molto lento perché cerca l'intero documento per la corrispondenza nodi. Se la struttura dei documenti che si sta lavorando con sta per essere coerente, si sono probabilmente meglio fuori utilizzando un percorso completo, ad esempio:

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

Si noti che ' // 'seleziona e ricerca su * tutti * i nodi del documento che può essere lento. Invece, se la struttura del documento è nota, utilizza un percorso corretto, come suggerito nella [risposta di Gilles] (http://stackoverflow.com/questions/14248063/xpath-to-select-element-by-attribute-value # 14248129) sotto. – Jens

+0

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

8

Prova a fare questo:

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

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

Problemi correlati