XPath para seleccionar Elemento por valor de atributo

195

Tengo el siguiente 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>

Quiero seleccionar el elemento Empleado con id = "4".

Estoy usando debajo de la expresión XPath que no devuelve nada.

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

Lo revisé en http://chris.photobooks.com/xml/default.htm y dice xpath no válido, no estoy seguro de dónde está el problema.

Pankaj
fuente

Respuestas:

278

Debe eliminar el /antes de [. Los predicados (las partes en [ ]) no deberían tener barras inmediatamente antes de ellos. Además, para seleccionar el elemento Empleado en sí, debe dejarlo /text()al final o, de lo contrario, solo seleccionaría los valores de texto de espacios en blanco inmediatamente debajo del elemento Empleado.

//Employee[@id='4']

Editar: como Jens señala en los comentarios, //puede ser muy lento porque busca nodos coincidentes en todo el documento. Si la estructura de los documentos con los que está trabajando será coherente, probablemente sea mejor usar una ruta completa, por ejemplo:

/Employees/Employee[@id='4']
JLRishe
fuente
3
Tenga en cuenta que //selecciona y busca en todos los nodos del documento que pueden ser lentos. En cambio, si se conoce la estructura del documento, utilice una ruta adecuada, como se sugiere en la respuesta de Gilles a continuación.
Jens
@Jens Sí, eso es absolutamente cierto. He editado mi respuesta para agregar un apéndice.
JLRishe
13

Como continuación, puede seleccionar "todos los nodos con un atributo particular" como este:

//*[@id='4']
rogerdpack
fuente
12

Intenta hacer esto:

/Employees/Employee[@id=4]/*/text()
Gilles Quenot
fuente
¿xmllint carga todo el archivo xml en la memoria antes de buscar los identificadores? Tengo un archivo xml de 46 GB y estoy buscando identificadores en él
Hani Goc
Archivo XML de 46 GB : existe el problema.
Gurwinder Singh