Werte auslesen mit xmlstarlet

FatManStanding

Lt. Junior Grade
Registriert
Aug. 2021
Beiträge
458
tach,

angenommen ich habe diese xml-datei:

Code:
<videodb>
<movie>
<title>alien</title>
<sorttitle>alien1</sorttitle>
<userrating>100</userrating>
</movie>
<movie>
<title>alien4</title>
<sorttitle>alien4</sorttitle>
<userrating>-100</userrating>
</movie>
</videodb>

nun will ich jeweils aus beiden <movie> die einträge für <title> und <sorttitle> auslesen. bisher habe ich das so gemacht

Code:
xmlstarlet sel -t -v "//videodb/movie/title" -v "//videodb/movie/sorttitle" videodb.xml

das heißt 2x mit der option '-c' arbeiten müssen. das wird schnell unübersichtlich wenn es mehr werden. gibt es bei xmlstartlet eine eifacherer variante wie z. b.

Code:
"//videodb/movie/title|sorttitle"
 
mit 1. antwort meinst du

Code:
/a/b/*[self::c or self::d or self::e]

und mit 2.

Code:
a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

(weil dazwischen liegen noch ein paar kommentare - ich finde stack immer etwas unübersichtlich)

beide gehen. mit namespace meinst du leerzeichen im namen?

ich finde zu "self::" und "local-name()" in der xmlstarlet-hilfe hier http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html#idm47077139594320 nichts, außer ein einigen beispielen. erklärt wird da aber nichts.
 
ja, ich meine diese beiden antworten. namespaces sind was anderes. in der doku zu xmlstarlet wirst du nicht viel zu diesen beiden lösungen finden. xmlstarlet selektiert die knoten innerhalb von xml anhand eines sogenannten xpath. die erklärung von xpath ist nicht im scope von xmlstarlet - das ist ein allgemeines feature von xml und funktioniert tool-übergreifend.
 
ok.

kann ich zwischen den einträgen noch eine art "seperator" einfügen, der sie sauber voneinander trennt. ich will je in der ausgabedatei je 'movie' eine zeile haben mit ein paar wenigen kind-elementen. die sollen alle mit ";" getrennt sein.

ich verstehe noch die ausgabe nicht so richtig. manchmal gibt xmlstarlet die ausgewählten elemente genau so aus wie in der datei, inkl. einrückungen und leerzeilen. manchmal erfolgt die gesamte ausgabe in einer langen zeile und manchmal jedes element in einer eigenen zeile. ich verwende dabei nichts anderes als "-t -v" oder "-t -c". kein zeilenumbruch mit "-n".
 
FatManStanding schrieb:
die sollen alle mit ";" getrennt sein.
das hört sich nach csv an. google meint dazu z.b. sowas:
Code:
$ xmlstarlet sel -T -t -m /videodb/movie -v "concat(title,';',sorttitle,';',userrating)" -n bla.xml
alien;alien1;100
alien4;alien4;-100
 
Zurück
Oben