Consultas XPath desde la línea de comandos

Existe una aplicación llamada

xmlstarlet

que permite hacer consultas XPath a archivos XML.

Supongamos el siguiente archivo XML, al cual llamaremos libro.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<xml version="1.0" encoding="UTF-8">

<libro>

<titulo>Patas arriba<titulo>
<autor>Eduardo Galeano</autor>

<capitulo num="1" titulo="La escuela del mundo al revés">
    <seccion num="1" titulo="Educando con el ejemplo">
        <parrafo destacado="si">La escuela del mundo al revés es la más democrática de las instituciones educativas.</parrafo>

        <parrafo>El mundo al revés premia al revés.</parrafo>
    </seccion>

    <seccion num="2" titulo="Los alumnos">
        <parrafo destacado="si">Día tras día, se niega a los niños el derecho de ser niños.</parrafo>
      <parrafo>En el océano del desamparo, se alzan las islas del privilegio.</parrafo>
    </seccion>
</capitulo>

<capitulo num="2" titulo="Cátedras del miedo">
    <seccion num="1" titulo="La enseñanza del miedo">
        <parrafo destacado="si">En un mundo que prefiere la seguridad a la justicia, hay cada vez más gente que aplaude el sacrificio de la justicia en los altares de la seguridad.</parrafo>
        <parrafo>A mediados de 1982, ocurrió en Río de Janeiro un hecho de rutina: la policía mató a un sospechoso de hurto.</parrafo>
    </seccion>

    <seccion num="2" titulo="La industria del miedo">
        <parrafo destacado="si">El miedo es la materia prima de las prósperas industrias de la seguridad privada y del control social.</parrafo>
        <parrafo>"Nuestra mejor publicidad son los noticieros de la televisión", dice, y bien sabe lo que dice, uno de los especialistas en la venta de seguridad.</parrafo>
    </seccion>

</capitulo>

</libro>

Consultas

Obtener el título del libro:

xmlstarlet select -t -v //titulo libro.xml

Obtener el capítulo 1:

xmlstarlet select -t -v "//capitulo[@num='1']" libro.xml

Obtener el capítulo 2:

xmlstarlet select -t -v "//capitulo[2]" libro.xml

Obtener el capítulo 2 usando last():

xmlstarlet select -t -v "//capitulo[last()]" libro.xml

Obtener la sección 1 del capítulo 2:

xmlstarlet select -t -v "/libro/capitulo[@num='2']/seccion[@num='1']" libro.xml

Obtener los párrafos que contienen algún atributo:

xmlstarlet select -t -c '//parrafo[@*]' libro.xml

Obtener los párrafos no destacados del capítulo 1:

xmlstarlet select -t -c "/libro/capitulo[@num='1']//parrafo[not(@destacado)]" libro.xml

Parámetros

Syntax for templates: -t|--template <options>
where <options>
  -c or --copy-of <xpath>         - print copy of XPATH expression
  -v or --value-of <xpath>        - print value of XPATH expression
  -o or --output <string>          - output string literal
  -n or --nl               - print new line
  -f or --inp-name         - print input file name (or URL)
  -m or --match <xpath>           - match XPATH expression
  -i or --if <test-xpath>              - check condition <xsl:if test="test-xpath">
  -e or --elem <name>            - print out element <xsl:element name="name">
  -a or --attr <name>            - add attribute <xsl:attribute name="name">
  -b or --break            - break nesting</xsl:attribute></name></xsl:element></name></xsl:if></test-xpath></xpath></string></xpath></xpath></options></options>

Sitio oficial: XMLStarlet Command Line XML Toolkit

Tags: , ,

Comments are closed.