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.