ubuntuusers.de

Werte aus XML ziehen, sed hilfe

Status: Ungelöst | Ubuntu-Version: Server 12.04 (Precise Pangolin)
Antworten |

Xydrail

Anmeldungsdatum:
20. Januar 2012

Beiträge: 43

Folgendes Szenario:

Ich bastel an einem System was mir morgens sagt was ich anziehen soll, anhand bestehender Wetterdaten der yahoo weather api. Aktiviert wird das ganze über einen bestehenden Arduino mit Schalter an meinem Kleiderschrank. Anhand einer Windchill Berechnung (sollte die auf yahoo ungenau sein) möchte ich in etwa sagen welche dicke meine Kleidung haben sollte. Sollte es Regen geben (was unten in der Wettervorhersage angegeben ist) soll mich das System per Sprachausgabe über gespeaker und mbrola warnen und mir sagen, das ich einen Regenschirm oder eine Regenjacke mitnehmen soll. Ausserdem ob ich eine Sonnenbrille einpacken soll.

Das ganze Programmiertechnisch betrachtet:

  • Schalter wird ausgelöst

  • Skript startet

  • Skript läd Yahoo XML

  • Daten aus Yahoo XML werden in Variablen gespeichert

  • Ausgabe des "Wettertextes" über gespeaker mit mbrola

  • Ende Skript

Die yahoo Weather API gibt einige Daten über das Wetter an, die ich nutzen möchte:

http://weather.yahooapis.com/forecastrss?u=c&w=20066448

Werte die ich benötige sind

  • yweather:wind

    • chill /integer

    • speed /integer

  • yweather:atmosphere

    • humidity /Integer

  • yweather:astronomy

    • sunrise /string

    • sunset /string

  • yweather:condition

    • code /integer

    • temp /integer

  • yweather:forecast

    • low /integer

    • high /integer

    • code /integer

Leider hapert es bei mir daran, die Daten aus eben jener XML zu ziehen.

Gibt es vielleicht einfachere Programme als sed? Gibt es möglicherweise ein besseres und allgemeinverständlicheres Programm? Kann mir jemand eine Einführung empfehlen?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Also eines gleich vorweg: solche zeilenorientierten Dinger wie sed sind für Tagorientierte Daten wie XML einfach das falsche Werkzeug.

Dafür gibt es xmlstarlet u.ä. !
So mal als 1. Skizze könnte das sowas werden:

xmlstarlet sel -N yweather="http://xml.weather.yahoo.com/ns/rss/1.0" -t -c //yweather:wind -c //yweather:atmosphere -c //yweather:astronomy -c //yweather:condition -c //yweather:forecast Yahoo\!\ Weather\ -\ Krefeld\,\ DE.xhtml 

Die einzelnen Felder wird man noch genauer aufschlüsseln, vielleicht so :

xmlstarlet sel -N yweather="http://xml.weather.yahoo.com/ns/rss/1.0" -t -m //yweather:wind -o "Wind " -v @chill -o ";" -v @speed -n Yahoo\!\ Weather\ -\ Krefeld\,\ DE.xhtml 

Eine kleine Tücke ist, dass Du den Yahoo-yweather: - Namespace einbinden musst. (das kannst Du aber als Formalie betrachten)

Bei curl (und auch sonst) muss man beachten, dass man den Adress-String sauber "quotet".

LG,

track

Edit:
Wenn man curl und xmlstarlet zusammenfasst, und das Ergebnis in ein Shell-Array speichert, könnte das so funktionieren:

wetter=( $( curl -s "http://weather.yahooapis.com/forecastrss?u=c&w=20066448"  |  xmlstarlet sel -N yweather="http://xml.weather.yahoo.com/ns/rss/1.0" -t -m //yweather:wind -v @chill -n -v @speed -n -v //yweather:atmosphere/@humidity -n -v //yweather:astronomy/@sunrise -n -v //yweather:astronomy/@sunset -m //yweather:condition -n -v @code -n -v @temp -m //yweather:forecast -n -v @low -n -v @high -n -v @code ) )
Antworten |