xmlstarlet

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein Terminal öffnen

Inhaltsverzeichnis
  1. Installation
  2. Benutzung
    1. Befehle
    2. Beispiele
      1. sel
      2. ed
    3. Links

xmlstarlet.png

XMLstarlet 🇬🇧 ist ein Kommandozeilen-Programm, mit dem XML-Dokumente transformiert, durchsucht, validiert und editiert werden können. XMLstarlet unterstützt die Berechnung von XPath-Ausdrücken. Die Software ist in C geschrieben und verwendet libxml2 🇬🇧.

Installation

XMLstarlet kann direkt aus den Quellen installiert werden [1].

Paketliste zum Kopieren:

sudo apt-get install xmlstarlet 

Oder mit apturl installieren, Link: apt://xmlstarlet

Das Programm kann dann sofort gestartet werden.

Benutzung

Die allgemeine Syntax von xmlstarlet lautet:

xmlstarlet [OPTIONEN] BEFEHL [BEFEHLSOPTIONEN]  [XML-DATEI ...] 

Wenn keine XML-Datei angegeben wird, liest das Programm von der Standardeingabe.

Befehle

Das Programm kennt unter anderem die folgenden Befehle:

Auswahl von Befehlen
Befehl Beschreibung
ed Editieren von XML-Dokumenten
sel Filtern bzw. Durchsuchen von XML-Dokumenten
tr Transformieren von XML-Dokumenten
val Validierung von XML-Dokumenten
fo Formatierung von XML-Dokumenten
el Zeigt die Elementstruktur eines XML-Dokuments

Weitere Befehle und die Optionen findet man auf der Manpage von XMLstarlet.

Beispiele

Im Folgenden wird angenommen, dass die Datei simpsons.xml diesen Aufbau hat:

 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
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpsons lang="de">
  <figur>
    <name>Homer Simpson</name>
    <alter>39</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>technischer Überwacher im KKW</Job>
      <Job>Astronaut</Job>
      <Job>Fett-Verkäufer</Job>
    </jobs>
    <hobbys>
      <Hobby>Bowling</Hobby>
      <Hobby>Angeln</Hobby>
    </hobbys>
    <freunde>
      <Freund>Carl</Freund>
      <Freund>Lenny</Freund>
    </freunde>
  </figur>
  
  <figur>
    <name>Marge Simpson </name>
    <alter>34</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>Hausfrau</Job>
      <Job>KKW Angestellte</Job>
      <Job>Polizistin</Job>
    </jobs>
    <hobbys>
      <Hobby>Malen</Hobby>
      <Hobby>Zeichnen</Hobby>
    </hobbys>
    <freunde>
    </freunde>
  </figur>
</simpsons>

sel

Syntax

xmlstarlet sel GLOBALE_OPTIONEN {TEMPLATE} [ XML-DATEI ... ] 

Für {TEMPLATE} benutzt man -t OPTIONEN, wobei einige OPTIONEN in folgender Tabelle aufgeführt sind.

Auswahl von Optionen
Option Beschreibung
-c XPATH Gibt eine Kopie des XPATH-Ausdrucks aus
-v XPATH Gibt den Wert des XPATH-Ausdrucks zurück
-m XPATH passt auf den XPATH-Ausdruck

Eine Übersicht der Optionen erhält man mit xml sel --help.

Beispiele

Um eine Kopie der Datei simpsons.xml auszugeben kann man folgenden Befehl benutzen

xmlstarlet sel -t -c "/" simpsons.xml 

Um nur die Elemente ohne die Namen auszugeben, benutzt man -v

xmlstarlet sel -t -v "/" simpsons.xml 
  
    Homer Simpson
    39
    
      Bart
      Lisa
      Maggie
    
    
      technischer Überwacher im KKW
      Astronaut
      Fett-Verkäufer
    
    
      Bowling
      Angeln
    
    
      Carl
      Lenny
    
  
  
  
    Marge Simpson 
    34
    
      Bart
      Lisa
      Maggie
    
    
      Hausfrau
      KKW Angestellte
      Polizistin
    
    
      Malen
      Zeichnen
    
    
    
  

Die Namen aller Simpsons in der Datei gibt

xmlstarlet sel -t -v "//name" simpsons.xml 

aus:

Homer Simpson
Marge Simpson

Die Jobs von Homer erhält man mit

xmlstarlet sel -t -v "/simpsons/figur[1]/jobs" simpsons.xml  
      technischer Überwacher im KKW
      Astronaut
      Fett-Verkäufer

oder alternativ mit

xmlstarlet sel -t -v  "//figur[name=\"Homer Simpson\"]/jobs"   simpsons.xml 

Zugriff auf Attribute erhält man mit @

xmlstarlet sel -t -v  "//@lang"   simpsons.xml  
de

ed

Syntax

xmlstarlet ed GLOBALE_OPTIONEN {AKTION} [XML-DATEI ...] 

Einige AKTIONEN sind in folgender Tabelle aufgeführt_

Auswahl von Aktionen
Aktion Beschreibung
-d XPATH Löscht XPATH.
-i XPATH -t elem|text|attr -n NAME [-v WERT] Fügt etwas mit NAME und WERT an der Stelle XPATH ein.
-s XPATH -t elem|text|attr -n NAME [-v WERT] Erstellt einen Unterknoten mit NAME und WERT an der Stelle XPATH.
-r XPATH -v NAME Benennt XPATH um
-u XPATH -v WERT Aktualisiert den Wert von XPATH

Eine Übersicht der Optionen erhält man mit xml ed --help.

Beispiele

Um den letzten Figur-Knoten zu löschen (Option -d) kann man

xmlstarlet ed -d "//figur[last()]" simpsons.xml 

nutzen:

 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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpsons lang="de">
  <figur>
    <name>Homer Simpson</name>
    <alter>39</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>technischer Überwacher im KKW</Job>
      <Job>Astronaut</Job>
      <Job>Fett-Verkäufer</Job>
    </jobs>
    <hobbys>
      <Hobby>Bowling</Hobby>
      <Hobby>Angeln</Hobby>
    </hobbys>
    <freunde>
      <Freund>Carl</Freund>
      <Freund>Lenny</Freund>
    </freunde>
  </figur>
</simpsons>

Um die job-Knoten in "beruf" umzubenennen benutzt man

xmlstarlet ed -r "/simpsons/*/jobs" -v "beruf" simpsons.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
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpsons lang="de">
  <figur>
    <name>Homer Simpson</name>
    <alter>39</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <beruf>
      <Job>technischer Überwacher im KKW</Job>
      <Job>Astronaut</Job>
      <Job>Fett-Verkäufer</Job>
    </beruf>
    <hobbys>
      <Hobby>Bowling</Hobby>
      <Hobby>Angeln</Hobby>
    </hobbys>
    <freunde>
      <Freund>Carl</Freund>
      <Freund>Lenny</Freund>
    </freunde>
  </figur>
  <figur>
    <name>Marge Simpson </name>
    <alter>34</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <beruf>
      <Job>Hausfrau</Job>
      <Job>KKW Angestellte</Job>
      <Job>Polizistin</Job>
    </beruf>
    <hobbys>
      <Hobby>Malen</Hobby>
      <Hobby>Zeichnen</Hobby>
    </hobbys>
    <freunde>
    </freunde>
  </figur>
</simpsons>

Um einen Wert zu aktualisieren kann man

xmlstarlet ed -u "/simpsons/figur[1]/alter" -v "40" simpsons.xml 

nutzen:

 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
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpsons lang="de">
  <figur>
    <name>Homer Simpson</name>
    <alter>40</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>technischer Überwacher im KKW</Job>
      <Job>Astronaut</Job>
      <Job>Fett-Verkäufer</Job>
    </jobs>
    <hobbys>
      <Hobby>Bowling</Hobby>
      <Hobby>Angeln</Hobby>
    </hobbys>
    <freunde>
      <Freund>Carl</Freund>
      <Freund>Lenny</Freund>
    </freunde>
  </figur>
  <figur>
    <name>Marge Simpson </name>
    <alter>34</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>Hausfrau</Job>
      <Job>KKW Angestellte</Job>
      <Job>Polizistin</Job>
    </jobs>
    <hobbys>
      <Hobby>Malen</Hobby>
      <Hobby>Zeichnen</Hobby>
    </hobbys>
    <freunde>
    </freunde>
  </figur>
</simpsons>

Ein Element hinzufügen geht mit

xmlstarlet ed -s "/simpsons/figur[1]/jobs" -t elem -n "job" -v "Einschienenbahn-Zugführer" simpsons.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
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpsons lang="de">
  <figur>
    <name>Homer Simpson</name>
    <alter>39</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>technischer Überwacher im KKW</Job>
      <Job>Astronaut</Job>
      <Job>Fett-Verkäufer</Job>
      <job>Einschienenbahn-Zugführer</job>
    </jobs>
    <hobbys>
      <Hobby>Bowling</Hobby>
      <Hobby>Angeln</Hobby>
    </hobbys>
    <freunde>
      <Freund>Carl</Freund>
      <Freund>Lenny</Freund>
    </freunde>
  </figur>
  <figur>
    <name>Marge Simpson </name>
    <alter>34</alter>
    <kinder>
      <kind>Bart</kind>
      <kind>Lisa</kind>
      <kind>Maggie</kind>
    </kinder>
    <jobs>
      <Job>Hausfrau</Job>
      <Job>KKW Angestellte</Job>
      <Job>Polizistin</Job>
    </jobs>
    <hobbys>
      <Hobby>Malen</Hobby>
      <Hobby>Zeichnen</Hobby>
    </hobbys>
    <freunde>
    </freunde>
  </figur>
</simpsons>

XMLstarlet kenn noch viele weitere Befehle und Optionen, zusätzliche Informationen entnimmt man dem XMLstarlet-Userguide 🇬🇧.