¿Cómo extraigo un único atributo de un archivo XML?

¿Cómo extraigo un único atributo de un archivo XML?

No estoy muy familiarizado con expresiones regulares, sed, etc. y me da un poco de pereza entenderlo en este momento, entonces, ¿cómo extraigo esta línea?

<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

Avíseme si se necesita más estructura xml.

Respuesta1

Dado que los datos de entrada (su archivo XML) están estructurados, es mejor utilizar una consulta sobre esos datos estructurados, en lugar de tratarlos como texto sin formato y alterar expresiones regulares.

Podemos usar xmllint --xpathpara evaluar una expresión XPath en su entrada xml:

$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am

- esto es un poco complicado, ya que tenemos que lidiar con los diferentes espacios de nombres en ese archivo, pero funciona de todos modos.

Para obtener más información sobre XPath, la especificación se encuentra enhttp://www.w3.org/TR/xpath/

Respuesta2

No usas expresiones regulares o sed. Utiliza un analizador XML y un lenguaje de consulta XML (XPath o XQuery). Y me temo que los detalles dependen del contexto: por ejemplo, "yweather" es un nombre corto (prefijo) para un espacio de nombres, y necesitas saber qué espacio de nombres representa.

Respuesta3

La respuesta correcta, como dice Michael Kay, es utilizar una herramienta específica de XML.

Para una solución rápida y sucia, aquí hay un enfoque sed. Comencemos con este archivo:

$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

Para extraer la hora del atardecer:

$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm

Para entender la expresión regular, dividámosla en tres partes:

  1. .*Partidos desde el inicio de la alineación hasta la segunda parte.

  2. Esta parte, sunset="([^"]*)"coincide con los caracteres sunset=", seguida de cualquier número de caracteres excepto ", seguido del cierre ". La expresión [^"]significa cualquier carácter excepto "y [^"]*significa cualquier número de dichos caracteres. El paréntesis (...), captura los caracteres dentro del "..."grupo 1 de sed al que luego nos referimos como \1.

  3. .* coincide con todos los caracteres después de la expresión del atardecer.

Respuesta4

daré la misma respuesta deJeremy Kerrpero dándole un xmlejemplo.

Tenemos un archivo xml llamado config.xmlen nuestra carpeta raíz y queremos leer un atributo o una propiedad de una etiqueta, sea la widgetetiqueta.

config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>AppName</name>
    <description>Description.</description>
    <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>

Queremos obtener el android-versionCodevalor de la propiedad, escribimos esto en la terminal:

xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml

Producción:

16

Explicación: usamos /*[local-name()='widget']para mapear la widgetetiqueta y luego @android-versionCodeleer la propiedad de esta.

información relacionada