Mi favorito es xmlstarlet porque parece ser más poderoso que xmllint:
xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
cuál es la mejor manera de apuntar a un elemento específico y luego profundizar en su elemento secundario
La expresión XPath correcta para hacer esto es:
/resources/item[@id="index.php"]/description/text()
En lenguaje sencillo:comience desde el nodo del documento hasta el elemento del documento resources
, a su hijo item
, pero solo si el valor de id
el atributo es "index.php", en su hijo description
y recuperar su valor textual.
Uso xmllint para validar documentos XML, pero nunca para expresiones de ruta. En un shell bash (al menos con Mac OS) hay una herramienta aún más simple para evaluar expresiones XPath, llamada "xpath":
$ xpath en.xml '/resources/item[@id="index.php"]/description/text()'
Entonces, se obtiene el siguiente resultado:
Found 1 nodes:
-- NODE --
DESCRIPTION
Si aún prefiere xmllint, utilícelo de la siguiente manera:
$ xmllint --xpath '/resources/item[@id="index.php"]/description/text()' en.xml > result.txt
De forma predeterminada, --xpath
implica --noout
, lo que evita que xmllint genere el archivo XML de entrada. Para que la salida sea más legible, redirijo la salida a un archivo.
$ cat result.txt
DESCRIPTION