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
GFU-Schulungen  [Anzeige]

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

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;
        }
    }
}

3 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.
BlackHole schrieb am 18.09.2019:
Stand 18.09.2019:
Die Api funktioniert wohl nicht mehr bzw. nicht mehr kostenlos.
Ich bekam jedenfalls immer als Ergebnis NULL zurück.

Schade, aber so ist das mit externen Schnittstellenanbieter. Stellen von heute auf morgen einfach so den Dienst ein.
Matthias Kahlert schrieb am 18.09.2019:
Als Ersatz durchaus empfehlenswert: https://www.openweathermap.org/
Auch die bieten eine gute API an, die einfach anzubinden ist.
 

Logge dich ein, um hier zu kommentieren!