2017-10-23 4 views
1

Ich bin auf der Suche nach dem Programmtitel und Untertitel aus der (abgeschnittenen) XML-Datei unten extrahieren. Ich extrahierte beide einzeln mit xmllint und sed und kombiniere sie in einer Datei, aber ich habe seitdem entdeckt, dass es gelegentlich Einträge gibt, die nur einen Titel und keinen Untertitel haben. In diesem Fall möchte ich den Untertitel leer lassen. Könnte jemand eine Möglichkeit vorschlagen, diese Diskrepanz zu erklären?Capture Xml-Tag und folgende verwandte Tag, wenn eines existiert

XML Datei

<programme start="20171013170000 +0100" stop="20171013180000 +0100" channel="b492458d826d592ec7c528545a16c757"> 
    <title lang="eng">Accessories Gift Hall</title> 
    <sub-title lang="eng">Find the perfect gift with fashion accessories by some of our most sought-after brands. From chic purses and wallets to cosy PJs and slippers, there&apos;s something for everyone.</sub-title> 
</programme> 
<programme start="20171013180000 +0100" stop="20171014130000 +0100" channel="b492458d826d592ec7c528545a16c757"> 
    <title lang="eng">..programmes start again at 1pm</title> 
</programme> 
<programme start="20171014130000 +0100" stop="20171014140000 +0100" channel="b492458d826d592ec7c528545a16c757"> 
    <title lang="eng">Ruth Langsford&apos;s Fashion Edit</title> 
    <sub-title lang="eng">TV personality and QVC fashion ambassador, Ruth Langsford, shares her favourite looks and must-have pieces that will transform your wardrobe and have you looking fabulously stylish.</sub-title> 
</programme> 

Bash-Befehle v1

xmllint --xpath "//programme/title" xmltv | sed -r 's/\n//g' | sed 's/<\/title>/\n/g' | sed 's/<title lang="eng">//g' > 1.txt 
xmllint --xpath "//programme/sub-title" xmltv | sed -r 's/\n//g' | sed 's/<\/sub-title>/\n/g' | sed 's/<sub-title lang="eng">//g' > 2.txt 
paste <(cat 1.txt) <(cat 2.txt) > 3.txt 

Dank!

+0

Ich denke xmlstarlet wäre eine bessere Wahl für diese Aufgabe; Wären Sie an einer xmlstarlet Lösung interessiert? –

+1

Ja bitte Daniel, ich habe auch von xmlstarlet gehört, ich bin mir nicht ganz sicher, was der Unterschied zwischen xmllint und xmllint ist. – user2679016

+0

Der Unterschied ist, dass xmlstarlet jede Ergebniszeilen mit Zeilenumbrüchen anzeigen (nicht der Fall für xmllint) –

Antwort

1

Hier ist ein Beispiel des sel Befehl von xmlstarlet von der Kommandozeile mit ...

$ xmlstarlet sel -T -t -m '//programme' -v 'concat(normalize-space(title)," ",normalize-space(sub-title))' -n input.xml 
Accessories Gift Hall Find the perfect gift with fashion accessories by some of our most sought-after brands. From chic purses and wallets to cosy PJs and slippers, there's something for everyone. 
..programmes start again at 1pm 
Ruth Langsford's Fashion Edit TV personality and QVC fashion ambassador, Ruth Langsford, shares her favourite looks and must-have pieces that will transform your wardrobe and have you looking fabulously stylish. 

Ich bin der Titel und Untertitel durch ein einzelnes Leerzeichen getrennt, aber das kann Cha sein nged.

+1

Das sieht richtig aus und ist super schnell! Ich denke ich sollte stattdessen xmlstarlet lernen! Vielen Dank! – user2679016

+0

Schöne Aufnahme, ja. –

0

Was ich tun würde:

#!/bin/bash 

count=$(xmllint --xpath "count(//programme)" /tmp/file.xml) 

for ((i=1; i<=count; i++)); do 
    xmllint --xpath "//programme[$i]/title/text()" /tmp/file.xml 
    echo -n '|' 
    xmllint --xpath "//programme[$i]/sub-title/text()" /tmp/file.xml 
    echo 
done 
+0

Schön, aber langsam. 15 Minuten bis jetzt auf die vollständige Datei, plus ein paar "XPath Set ist leer" -Fehler. – user2679016

0

In einem Durchgang mit sed

sed '/<title/!d;N;/<sub-title/!s/\n.*//' XML File 
+0

Bis jemand XML formatiert und entweder der Titel oder der Untertitel nicht mehr in der gleichen Zeile steht. (https://StackOverflow.com/a/1732454/317052) –

+0

Ja, ich muss die Xml ausziehen und den Titel und den Untertitel nebeneinander haben. – user2679016

Verwandte Themen