ubuntuusers.de

XMLStarlet Ausgabe in Variable speichern

Status: Gelöst | Ubuntu-Version: Xubuntu 12.04 (Precise Pangolin)
Antworten |

BlackBoxCoder

Anmeldungsdatum:
19. Juni 2013

Beiträge: 22

Hallo liebe Ubuntuusers,

ich baue mir grade einen RSS-Feed leser.

Dieser soll immer den neusten Feed in der Shell ausgaben.

Ich arbeite mit XMLStarlet, und kann auch schon den neusten Feed ausgeben. Leider kann ich die ausgabe des pubDate nicht in eine Variable speichern.

Ich möchte die Variable pubDate mit einer Datei vergleichen, in der die letzte Variable gespeichert worden ist.

Und nur wenn die beiden strings sich unterscheiden soll der neue RSS-Feed angezeigt werden.

Aufbau:

-->CheckPubdate(neuste RSS-Feed) --> Vergleiche mit Datei (lastfeed.t) -->Wenn die Strings sich unterscheiden --> gib den neusten Feed aus--> Wenn keine Unterscheidung dann mache nichts --> Speichere neuste PubDate in die Datei.

Ich hoffe es ist ersichtlich was ich machen möchte.

Hier mein Script:

#!/bin/bash
RSS_URL=http://www.rss-specifications.com/rss-podcast.xml
wget ${RSS_URL} -O - 2>/dev/null | \
xmlstarlet sel -t -m "/rss/channel/item[1]" \
   -v "pubDate" -n -v "title" -n -v "link" -n -n

Vielleicht habt ihr ja eine Idee.

Gruß, BlackBoxCoder

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

so wie ich das sehe, gibst du 3 Zeilen aus - vorausgesetzt die einzelnen Elemente enthalten keine Zeilenumbrüche, was wohl nicht sein wird.

Du willst die erste Zeile abfischen und in einer Variablen verfügbar haben und den Rest dann ausgeben wenn er neuer ist, als das was du schon vorliegen hast?

In einem Rutsch ist das etwas umständlich. Speicherst du das komplette Ding in eine Variable, gehen die Zeilenumbrüche verloren und der String wird uneindeutig.

Ich würde die 3 Zeilen temporär in einer Datei halten und dann die erste Zeile lesen (z.B. head -n 1) und prüfen.

BlackBoxCoder

(Themenstarter)

Anmeldungsdatum:
19. Juni 2013

Beiträge: 22

So, ich glaube ich habe mich zu undeutlich ausgedrückt.

Das ist leider manchmal mein Problem, mir scheint es im Kopf so klar, denn ich weiß ja was ich will.☺

Ich habe mal ein Struktogramm erstellt (hängt an).

ich muss nur wissen wie ich die Ausgabe "pubDate" in eine Variable gespeichert bekomme. Den Rest sollte ich hinbekommen.

Ungültiges Makro

Dieses Makro ist nicht verfügbar

Gruß, BBC

Bilder

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

also nur das pubDate?

Dann lies mit dem xmlstarlet NUR das pubDate und weise die Ausgabe auf stdout deiner Variablen zu.

Das geht in der Shell so:

myVariable=$( irgendeinCommand )

In deinem Fall ...

myVar=$(wget ${RSS_URL} -O - 2>/dev/null | .... xmlstarlet ... -v "pubDate" )

also allein das pubDate herausfischen.

BlackBoxCoder

(Themenstarter)

Anmeldungsdatum:
19. Juni 2013

Beiträge: 22

Danke für deine Antwort, die hat mir echt geholfen.

Ich möchte euch mein Ergebnis auch präsentieren, denn vielleicht hat ja noch Jemand so ein Problem.

 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
#!/bin/bash
RSS_URL=http://www.rss-specifications.com/rss-podcast.xml

#get the title
getTitle=$(wget ${RSS_URL} -O - 2>/dev/null | \
xmlstarlet sel -t -m "/rss/channel/item[1]" \
   -v "title" | tr -d ' ')

#get content from lastTitle.f
contTitle="$(cat ~/lastTitle.f | tr -d ' ')"

#compare title from file and from feed
if [ $getTitle = $contTitle ]; then
	#put the title to lastTitle.f
	echo $getTitle > ~/lastTitle.f
else
	#get the Date (again)
	NDate=$(wget ${RSS_URL} -O - 2>/dev/null | \
	xmlstarlet sel -t -m "/rss/channel/item[1]" \
	-v "pubDate")

	#get the Link
	NLink=$(wget ${RSS_URL} -O - 2>/dev/null | \
	xmlstarlet sel -t -m "/rss/channel/item[1]" \
	-v "link")

	#get the Title
	NTitle=$(wget ${RSS_URL} -O - 2>/dev/null | \
	xmlstarlet sel -t -m "/rss/channel/item[1]" \
	-v "title")

	#show the user the feed
	notify-send "New Feed" "$NTitle\n$NDate\n<a href='$NLink'>go2feed</a>"

	#put the title to lastTitle.f
	echo $getTitle > ~/lastTitle.f
fi

Schönen Abend, BlackBoxCoder

Antworten |