staging.inyokaproject.org

Wie mit xmlstarlet zeilenweise auslesen?

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

fireworker72

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Hallo Freunde

Ich möchte in einer schleife ein XML File zeilenweise auslesen und 2 Werte herauspicken (bis zum Ende des Files)

1
2
3
4
5
<GroupAddress Name="Luster schalten" Address="0/0/1" DPTs="DPST-1-1" />
<GroupAddress Name="Luster dimmen" Address="0/0/2" DPTs="DPST-3-7" />
<GroupAddress Name="Luster Wert" Address="0/0/3" DPTs="DPST-5-4" />
.....
.....

von da würde Ich (z.B.: erste Zeile) den Namen Luster schalten und die Adresse 0/0/1 benötigen

und diese werte in eine Datei schreiben

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
while......
$Name = name aus xml Datei zeile1 auslesen
$Addresse = Addresse aus xml Datei zeile1 auslesen
echo $Name >> Name.txt
echo $Adresse >> Adress.txt

nächster Durchgang:
$Name = name aus xml Datei zeile2 auslesen
$Addresse = Addresse aus xml Datei zeile2 auslesen
echo $Name >> Name.txt
echo $Adresse >> Adress.txt

done  usw. bis alle Zeilen ausgelesen sind

echo fertig

Wie gehe Ich das am besten an?

Ich kann zwar die Werte einzeln auslesen (xmlstarlet sel -t -v "//_:GroupAddress/@Name" -n /opt/datei.xml) und xmlstarlet sel -t -v "//_:GroupAddress/@Address" -n /opt/datei.xml) weiß aber nicht wie das zeilenweise geht

Bitte um Hilfe

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

XML ist keine zeilenbasierte Datenstruktur, da zählen nur die Grenzen der einzelnen Elemente.

Ich denke das was da am ehesten dran kommt ist sowas (das hatte ich schon im ursprünglichen Thread angemerkt):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
xml_file='peter.xml'
declare -A datatypes

while IFS='=' read -d $'\n' -r name address
do
    datatypes["$address"]="$name"  # mit einem Assoziativen Array kann man schnell auf die Werte zugreifen
    # ansonsten:
    echo "$name" >> Name.txt
    echo "$address" >> Adrresse.txt
done < <(xmlstarlet sel -T -t -m '//_:GroupAddress' -v 'concat(@Name, "=", @Address)' -n "$xml_file")

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Perfekt

Du bist der beste

Vielen Dank

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Noch eine Sache: es ist unschön immer wieder dieselbe Datei zu öffnen und zu schließen. Deshalb schlage ich vor, das so zu machen (Zeile 5, 11 und 12):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
xml_file='peter.xml'
declare -A datatypes

# open files
exec 3> Name.txt 4> Adrresse.txt

while IFS='=' read -d $'\n' -r name address
do
    datatypes["$address"]="$name"  # mit einem Assoziativen Array kann man schnell auf die Werte zugreifen
    # ansonsten:
    echo "$name" >&3
    echo "$address" >&4
done < <(xmlstarlet sel -T -t -m '//_:GroupAddress' -v 'concat(@Name, "=", @Address)' -n "$xml_file")

Das hat auch den angenehmen Effekt, dass alle Ausgaben einer Skriptausführung in derselben Datei landen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Sehr viel einfacher ist es natürlich mit sed, der für das zeilenweise Lesen und filtern von Dateien geschaffen ist:

1
2
sed -r 's/.*Name="([^"]+)" .*/\1/' peter.xml    > name.txt 
sed -r 's/.*Address="([^"]+)" .*/\1/' peter.xml > adr.txt 

Das liest die Datei 2x aber ist klar, kurz und geradeaus.

Antworten |