GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden Sie XMLStarlet, um XML im Linux-Terminal zu parsen

Das Erlernen des Parsens von XML wird oft als komplexes Unterfangen angesehen, muss es aber nicht sein. XML ist stark und streng strukturiert, daher ist es relativ vorhersehbar. Es gibt auch viele Tools, die dabei helfen, die Arbeit handhabbar zu machen.

Eines meiner Lieblings-XML-Dienstprogramme ist XMLStarlet, ein XML-Toolkit für Ihr Terminal. Mit XMLStarlet können Sie XML-Daten validieren, parsen, bearbeiten, formatieren und transformieren. XMLStarlet ist ein relativ minimaler Befehl, aber das Navigieren in XML ist voller Potenzial, daher zeigt dieser Artikel, wie man es verwendet, um XML-Daten abzufragen.

Installieren

XMLStarlet wird standardmäßig auf CentOS, Fedora und vielen anderen modernen Linux-Distributionen installiert, also öffnen Sie einfach ein Terminal und geben Sie xmlstarlet ein um darauf zuzugreifen. Wenn XMLStarlet noch nicht installiert ist, bietet Ihr Betriebssystem an, es für Sie zu installieren.

Alternativ können Sie das xmlstarlet installieren Befehl von Ihrem Paketmanager:

$ sudo dnf install xmlstarlet

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Verwenden Sie unter macOS MacPorts oder Homebrew. Verwenden Sie unter Windows Chocolatey.

Sollte alles andere fehlschlagen, können Sie es manuell aus dem Quellcode auf Sourceforge installieren.

XML mit XMLStarlet parsen

Es gibt viele Werkzeuge, die entwickelt wurden, um beim Analysieren und Transformieren von XML-Daten zu helfen, einschließlich Softwarebibliotheken, mit denen Sie Ihren eigenen Parser und komplexe Befehle wie fop schreiben können und xsltproc . Manchmal müssen Sie XML-Daten jedoch nicht verarbeiten; Sie brauchen nur eine praktische Möglichkeit, wichtige Daten zu extrahieren, zu aktualisieren oder einfach nur zu validieren. Für spontane XML-Interaktionen verwende ich xmlstarlet , eine klassische Anwendung im Stil eines "Schweizer Taschenmessers", die die gängigsten XML-Aufgaben erledigt. Sie können sehen, was es zu bieten hat, indem Sie den Befehl zusammen mit --help ausführen Möglichkeit:

$ xmlstarlet --help
Usage: xmlstarlet [<options>] <command> [<cmd-options>]
where <command> is one of:
  ed    (or edit)      - Edit/Update XML document(s)
  sel   (or select)    - Select data or query XML document(s) (XPATH, etc)
  tr    (or transform) - Transform XML document(s) using XSLT
  val   (or validate)  - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG)
  fo    (or format)    - Format XML document(s)
  el    (or elements)  - Display element structure of XML document
  c14n  (or canonic)   - XML canonicalization
  ls    (or list)      - List directory as XML
[...]

Sie können weitere Hilfe erhalten, indem Sie --help anhängen am Ende eines dieser Unterbefehle:

$ xmlstarlet sel --help
  -Q or --quiet             - do not write anything to standard output.
  -C or --comp              - display generated XSLT
  -R or --root              - print root element <xsl-select>
  -T or --text              - output is text (default is XML)
  -I or --indent            - indent output
[...]

Datenauswahl mit sel

Sie können die Daten in XML mit dem xmlstarlet select anzeigen (sel kurz) Befehl. Hier ist ein einfaches XML-Dokument:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
  <os>
   <linux>
    <distribution>
      <name>Fedora</name>
      <release>7</release>
      <codename>Moonshine</codename>
      <spins>
        <name>Live</name>
        <name>Fedora</name>
        <name>Everything</name>
      </spins>
    </distribution>

    <distribution>
      <name>Fedora Core</name>
      <release>6</release>
      <codename>Zod</codename>
      <spins></spins>
    </distribution>
   </linux>
  </os>    
</xml>

Bei der Suche nach Daten in einer XML-Datei besteht Ihre erste Aufgabe darin, sich auf den Knoten zu konzentrieren, den Sie untersuchen möchten. Wenn Sie den Pfad zum Knoten kennen, geben Sie den vollständigen Pfad mit --value-of an Möglichkeit. Je früher Sie in der Document Object Model (DOM)-Baumstruktur beginnen, desto mehr Informationen sehen Sie:

$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution \
--nl myfile.xml
      Fedora
      7
      Moonshine
     
        Live
        Fedora
        Everything     
     
      Fedora Core
      6
      Zod

Der --nl steht für "neue Zeile" und fügt reichlich Leerzeichen ein, um sicherzustellen, dass Ihre Terminal-Eingabeaufforderung eine neue Zeile erhält, nachdem Ihre Ergebnisse eingegangen sind. Ich habe einen Teil des überschüssigen Platzes in der Beispielausgabe entfernt.

Grenzen Sie Ihren Fokus ein, indem Sie weiter in den DOM-Baum hinabsteigen:

$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution/name \
--nl myfile.xml
Fedora
Fedora Core

Bedingte Auswahl

Eines der leistungsstärksten Tools zum Navigieren und Analysieren von XML heißt XPath. Es regelt die bei XML-Suchvorgängen verwendete Syntax und ruft Funktionen aus XML-Bibliotheken auf. XMLStarlet versteht XPath-Ausdrücke, sodass Sie Ihre Auswahl mit einer XPath-Funktion bedingt machen können. XPath bietet eine Fülle von Funktionen und ist ausführlich vom W3C dokumentiert, aber ich finde die XPath-Dokumentation von Mozilla prägnanter.

Sie können eckige Klammern als Testfunktion verwenden und den Inhalt eines Elements mit einem bestimmten Wert vergleichen. Hier ist ein Test für den Wert von <name> -Element, das die Versionsnummer zurückgibt, die nur mit einer bestimmten Übereinstimmung verknüpft ist.

Stellen Sie sich für einen Moment vor, dass die Beispiel-XML-Datei alle Fedora-Releases enthält, die mit 1 beginnen. Um alle Release-Nummern anzuzeigen, die mit dem alten Namen „Fedora Core“ verbunden sind (das Projekt hat „Core“ aus dem Namen ab Release 7 gestrichen):

$ xmlstarlet sel --template \
--value-of '/xml/os/linux/distribution[name = "Fedora Core"]/release' \
--nl myfile.xml
6
5
4
3
2
1

Sie können auch alle Codenamen für diese Veröffentlichungen anzeigen, indem Sie --value-of ändern Pfad zu /xml/os/linux/distribution[name = "Fedora Core"]/codename .

Pfade zuordnen und Werte abrufen

Ein Vorteil der Betrachtung von XML-Tags als Knoten besteht darin, dass Sie sich den Knoten, sobald Sie ihn gefunden haben, als Ihr aktuelles „Verzeichnis“ von Daten vorstellen können. Es ist nicht wirklich ein Verzeichnis, zumindest nicht im Sinne des Dateisystems, aber es ist eine Sammlung von Daten, die Sie abfragen können. Um Ihnen dabei zu helfen, Ihr Ziel und die "darin enthaltenen" Daten getrennt zu halten, unterscheidet XMLStarlet mit --match zwischen dem, was Sie versuchen abzugleichen Option und den Wert der gewünschten Daten mit einem --value-of Option.

Angenommen, Sie wissen, dass <spin> Knoten enthält mehrere Elemente. Das macht es zu Ihrem Ziel. Sobald Sie dort sind, können Sie --value-of verwenden um anzugeben, für welches Element Sie einen Wert wünschen. Um alle Elemente anzuzeigen, verwenden Sie einen Punkt (. ), um Ihren aktuellen Standort darzustellen:

$ xmlstarlet sel --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' --nl myfile.xml \
Live
Fedora
Everything

Wie beim Navigieren im DOM können Sie XPath-Ausdrücke verwenden, um den Umfang der zurückgegebenen Daten einzuschränken. In diesem Beispiel verwende ich last() Funktion, um nur das letzte Element im spin abzurufen Knoten:

$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[last()]' --nl myfile.xml
Everything

In diesem Beispiel verwende ich die position() Funktion, um ein bestimmtes Element im spin auszuwählen Knoten:

$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[position() = 2]' --nl myfile.xml
Fedora

Der --match und --value-of Optionen können sich überschneiden, also liegt es an Ihnen, wie Sie sie zusammen verwenden möchten. Diese beiden Ausdrücke machen im Fall des Beispiel-XML dasselbe:

$ xmlstarlet select  --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' \
--nl myfile.xml
Live
Fedora
Everything     

$ xmlstarlet select --template \
--match '/xml/os/linux/distribution' \
--value-of 'spin' \
--nl myfile.xml
Live
Fedora
Everything

Mit XML vertraut werden

XML kann manchmal übertrieben und unhandlich erscheinen, aber die Tools, die dafür entwickelt wurden, damit zu interagieren, überraschen mich immer wieder. Wenn Sie XML nutzen möchten, könnte XMLStarlet ein guter Einstiegspunkt sein. Wenn Sie das nächste Mal eine XML-Datei öffnen, um sich strukturierte Daten anzusehen, versuchen Sie es mit XMLStarlet und sehen Sie, ob Sie diese Daten stattdessen abfragen können. Je vertrauter Sie mit XML werden, desto besser kann es Ihnen als robustes und flexibles Datenformat dienen.


Linux
  1. Kopieren Sie Dateien im Linux-Terminal

  2. Benennen Sie eine Datei im Linux-Terminal um

  3. Verschieben Sie Dateien im Linux-Terminal

  4. Verwenden Sie das Linux-Terminal, um durch Ihren Computer zu navigieren

  5. Verwenden Sie das Linux-Terminal, um zu sehen, welche Dateien sich auf Ihrem Computer befinden

Entspannen Sie am Feuer an Ihrem Linux-Terminal

So verwenden Sie den Linux-Verlaufsbefehl

So verwenden Sie den Linux-xargs-Befehl

So verwenden Sie das Linux-Terminal in Android

So analysieren oder zeigen Sie XML-Code in der Linux-Befehlszeile an

Verwendung des grep-Befehls unter Linux