Feedback

C# - Wunderground Wettervorhersage

Veröffentlicht von am 29.08.2010
(2 Bewertungen)
Diese Klasse ruft per XML Schnittstelle von Wunderground die Wettervorhersage für einen beliebigen Ort ab.

Aufruf: List<WundergroundForecastData> GetForecast("Regensburg,Germany");

Die Ortsangabe kann direkt unter www.wunderground.com geprüft werden, Angabe am Besten immer inkl. Land (auf Englisch).

Eine vollständige Beschreibung der API gibt es hier:
http://wiki.wunderground.com/index.php/API_-_XML#ForecastXML
using System;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Xml;

namespace MaxPro.Common.Wetter
{
    //========================================================================================================================
    /// <summary>
    /// Schnittstelle zum Weather Underground, wunderground.com
    /// </summary>
    public static class Wunderground
    {
        //------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Struktur für die Ergebnis-Daten
        /// </summary>
        public struct WundergroundForecastData
        {
            /// <summary>
            /// Tagesdatum
            /// </summary>
            public DateTime Datum;
            /// <summary>
            /// Wetter-Vorhersage
            /// </summary>
            public string Condition;
            /// <summary>
            /// Bezeichnung für das dazustellende Icon
            /// </summary>
            public string Icon;
            /// <summary>
            /// Tiefste Temperatur
            /// </summary>
            public int TemperatureLow;
            /// <summary>
            /// Höchste Temperatur
            /// </summary>
            public int TemperatureHigh;
        }

        //------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Wettervorhersage für einen Ort herunterladen
        /// </summary>
        /// <param name="ort"></param>
        /// <returns></returns>
        public static IEnumerable<WundergroundForecastData> GetForecast(string ort)
        {
            // Ergebnis
            List<WundergroundForecastData> ergebnis = new List<WundergroundForecastData>();

            // Erstmal einen Webclient holen
            WebClient web = new WebClient();

            // XML Service von Wunderground
            string url = "http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=" + ort;
            string xmlWunderground;
            try
            {
                using (StreamReader sr = new StreamReader(web.OpenRead(url)))
                {
                    xmlWunderground = sr.ReadToEnd();
                    sr.Close();
                }
            }
            catch (Exception)
            {
                return null;
            }

            // XML auslesen
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlWunderground);
            XmlElement root = doc.DocumentElement;
            if (root != null)
            {
                XmlNode simpleForecast = root["simpleforecast"];
                if (simpleForecast != null)
                {
                    // Alle Elemente der Auflistung durcharbeiten
                    foreach (XmlNode forecastDay in simpleForecast)
                    {
                        // Ist es wirklich ein Forecast?
                        if (forecastDay.Name == "forecastday")
                        {
                            // Ergebnis einfügen
                            WundergroundForecastData wfd = new WundergroundForecastData();

                            // Datum aus der Datei lesen
                            XmlNode dateNode = forecastDay["date"];
                            if (dateNode != null)
                                wfd.Datum = new DateTime(dateNode["year"].GetInnerTextInt(), dateNode["month"].GetInnerTextInt(), dateNode["day"].GetInnerTextInt());

                            // Temperatur
                            XmlNode lowTemp = forecastDay["low"];
                            if (lowTemp != null)
                                wfd.TemperatureLow = lowTemp["celsius"].GetInnerTextInt();
                            XmlNode highTemp = forecastDay["low"];
                            if (highTemp != null)
                                wfd.TemperatureHigh = highTemp["celsius"].GetInnerTextInt();

                            // Condition
                            wfd.Condition = forecastDay["conditions"].GetInnerText();
                            wfd.Icon = forecastDay["icon"].GetInnerText();

                            // Ergebnis speichern
                            ergebnis.Add(wfd);
                        }
                    }
                }
            }

            // Ergebnis
            return ergebnis;
        }

        //------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// InnerText eines XmlElement als String zurückgeben
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private static string GetInnerText(this XmlElement node)
        {
            if (node != null)
                return node.InnerText;
            return "";
        }

        //------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// InnerText eines XmlElement als Integer zurückgeben
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private static int GetInnerTextInt(this XmlElement node)
        {
            try
            {
                if (node != null)
                    return Convert.ToInt32(node.InnerText);
            }
            catch (Exception) { }
            return 0;
        }
    }
}

1 Kommentare zum Snippet

sam99 schrieb am 23.06.2012:
An sich ganz gut, nur in Zeile 100 müsste
XmlNode highTemp = forecastDay["high"];
statt
XmlNode highTemp = forecastDay["low"];

stehen.
 

Logge dich ein, um hier zu kommentieren!