Wie extrahiere ich ein einzelnes Attribut aus einer XML-Datei?

Wie extrahiere ich ein einzelnes Attribut aus einer XML-Datei?

Ich kenne mich mit Regex, Sed usw. nicht so gut aus und bin ein bisschen zu faul, das gleich herauszufinden. Wie extrahiere ich also diese Zeile:

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

Lassen Sie mich wissen, ob mehr von der XML-Struktur benötigt wird.

Antwort1

Da die Eingabedaten (Ihre XML-Datei) strukturiert sind, ist es besser, eine Abfrage für diese strukturierten Daten durchzuführen, statt sie als einfachen Text zu behandeln und mit regulären Ausdrücken herumzuspielen.

Wir können xmllint --xpatheinen XPath-Ausdruck für Ihre XML-Eingabe auswerten:

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

– das ist etwas umständlich, da wir in dieser Datei mit den unterschiedlichen Namespaces umgehen müssen, aber es funktioniert trotzdem.

Weitere Informationen zu XPath finden Sie in der Spezifikation unterhttp://www.w3.org/TR/xpath/

Antwort2

Sie verwenden weder Regex noch Sed. Sie verwenden einen XML-Parser und eine XML-Abfragesprache (XPath oder XQuery). Und ich fürchte, die Details hängen vom Kontext ab: Beispielsweise ist „yweather“ ein Kurzname (Präfix) für einen Namespace, und Sie müssen wissen, welchen Namespace er darstellt.

Antwort3

Die richtige Antwort ist, wie Michael Kay sagt, die Verwendung eines XML-spezifischen Tools.

Hier ist eine schnelle und einfache Lösung mit einem Sed-Ansatz. Beginnen wir mit dieser Datei:

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

So extrahieren Sie die Sonnenuntergangszeit:

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

Um den regulären Ausdruck zu verstehen, teilen wir ihn in drei Teile auf:

  1. .*Übereinstimmungen vom Anfang der Zeile bis zum zweiten Teil

  2. Dieser Teil, sunset="([^"]*)", entspricht den Zeichen sunset=", gefolgt von einer beliebigen Anzahl von Zeichen außer ", gefolgt vom schließenden ". Der Ausdruck [^"]bedeutet jedes Zeichen außer "und [^"]*bedeutet eine beliebige Anzahl solcher Zeichen. Die Klammern, (...), erfassen die Zeichen innerhalb von "..."in seds Gruppe 1, die wir später als referenzieren \1.

  3. .* passt zu allen Zeichen nach dem Sonnenuntergangsausdruck.

Antwort4

Ich werde die gleiche Antwort geben wieJeremy Kerraber ich gebe ihm ein xmlBeispiel.

Wir haben eine XML-Datei config.xmlin unserem Stammordner und möchten ein Attribut oder eine Eigenschaft eines Tags lesen, sei es das widgetTag.

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>

Wir möchten den android-versionCodeEigenschaftswert erhalten, wir geben Folgendes in das Terminal ein:

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

Ausgabe:

16

Erklärung: Wir verwenden es, /*[local-name()='widget']um das Tag zuzuordnen widgetund dann @android-versionCodedie Eigenschaft davon zu lesen.

verwandte Informationen