xmllint Ausgabe pipen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
safran
Beiträge: 94
Registriert: 02.01.2008 04:46:07
Lizenz eigener Beiträge: Artistic Lizenz

xmllint Ausgabe pipen

Beitrag von safran » 10.05.2018 01:59:40

Hallo,

angenommen ich hab diese XML Datei:

Code: Alles auswählen

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <verzeichnis>
         <titel>Schweiz</titel>
         <Kanton name="Genf">
              <Stadt Einwohnerzahl="200000">Genf</Stadt>
              <Stadt>Vernier</Stadt>
         </Kanton>
         <Kanton name="Waadt">
              <Stadt Einwohnerzahl="250000">Lausanne</Stadt>
         </Kanton>
         <Kanton name="Kalb">
              <Stadt Einwohnerzahl="2500">Dorf</Stadt>
         </Kanton>
    </verzeichnis>
und möchte jetzt nur Städte anzeigen lassen die mindestens 100000 Anwohner haben, wie bekomme ich da jeden Eintrag einzeln heraus und dann in eine if-Schleife gepiped?

Code: Alles auswählen

xmllint  --xpath "/verzeichnis/Kanton/Stadt/@Einwohnerzahl" datei.xml
 Einwohnerzahl="200000"
das zeigt mir nur das erste Attribut an.

Code: Alles auswählen

xmllint  --xpath "/verzeichnis/Kanton/Stadt/" datei.xml
 <Stadt Einwohnerzahl="200000">Genf</Stadt><Stadt>Vernier</Stadt><Stadt>Lausanne</Stadt>
das spuckt mir alle direkt hintereinander aus.

gerne hätte ich aber eine Schleife

Solange Elemente "Stadt->Einwohnerzahl eingelesen werden, vergleiche den Wert Einwohnerzahl mit 100000, falls kleiner continue, falls größer/gleich echo "gefunden"

Wie ginge denn sowas?

ich werde das Ergebnis ins Wiki einpflegen in den Artikel zu dem XML Thema.

Danke

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: xmllint Ausgabe pipen

Beitrag von catdog2 » 10.05.2018 07:54:37

Ich weiss jetzt nicht was du genau vor hast aber das gibt dir die erste Einwohnerzahl >=10000:

Code: Alles auswählen

% xmllint --xpath "string((/verzeichnis/Kanton/Stadt[@Einwohnerzahl>=10000])[1]/@Einwohnerzahl)" datei.xml 
200000
// edit:
Du kannst natürlich auch den Namen der 1. Stadt haben:

Code: Alles auswählen

% xmllint --xpath "string( (/verzeichnis/Kanton/Stadt[@Einwohnerzahl>=10000])[1])" datei.xml                                                    :(
Genf
oder aller (xmllint lässt einen leider keinen delimiter setzen, deswegen Debianxmlstarlet)

Code: Alles auswählen

xmlstarlet sel -t -v "/verzeichnis/Kanton/Stadt[@Einwohnerzahl>=10000]/text()"  datei.xml                                                      :(
Genf
Lausanne
// edit2:
Oder natürlich auch beides zusammen:

Code: Alles auswählen

% xmlstarlet sel -t -m "/verzeichnis/Kanton/Stadt[@Einwohnerzahl>=10000]" -v 'text()' -o ' ' -v '@Einwohnerzahl' -n  datei.xml
Genf 200000
Lausanne 250000
Unix is user-friendly; it's just picky about who its friends are.

Antworten