2

xmlファイルは次の場所にあります:http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml

今、私はで値をフェッチしたいと思いますtemp_c, relative_humidity, wind_string

そのために、WeatherReader.csクラスを次のように作成しました。

using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml;

namespace CNGS
{
    public class WeatherReader
    {   public int Temp;
        public string Humidity;
        public string Wind;
        public string place;

        private void PopulateWeatherData()
        {
            XmlReader reader = XmlReader.Create("http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml");

            reader.MoveToContent();            

            while (reader.Read())
            {
                if (reader.LocalName == "temp_c")
                {
                    Temp = Convert.ToInt32(reader.Value);
                }
if (reader.LocalName == "relative_humidity")
                {
                    Humidity=reader.Value;
                }
if (reader.LocalName == "wind_string")
                {
                    Wind= reader.Value;
                }


            }

            reader.Close();
        }
    }
}

それは正しいですか、それは必要な値をフェッチしますか?

この情報をSilverlightページに表示したいので。クラスweatherreaderのオブジェクトを次のように作成しようとしました

WeatherReader Weath = new WeatherReader();

しかし、Temp、Windの値などを取得する方法がわかりませんか?何も機能していませんint tmp = Weath.Temp

助けてください

天気データを取得し、それをMainPageのSilverlightコントロールで使用して、ライブ天気予報を表示したいと思います。

ありがとう

4

3 に答える 3

1

いいえXmlReader、ドキュメントを読むために を使用する方法ではありません。実際には、それよりもはるかに複雑です... 複雑すぎます。

これにはLINQ to XMLを使用する方がはるかに簡単になるため、より良い結果が得られます。

var xml = "http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml";
var doc = XDocument.Load(xml);
var currentObservation = doc.Element("response").Element("current_observation");
var temp = (int)currentObservation.Element("temp_c");
var humidity = (string)currentObservation.Element("relative_humidity");
var wind = (string)currentObservation.Element("wind_string");

を使用したい場合は、次のXmlReaderようにする必要があります。

var xml = "http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml";
using (var reader = XmlReader.Create(xml))
{
    var temp = default(int);
    var humidity = default(string);
    var wind = default(string);

    string elementName = null;
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
        case XmlNodeType.Element:
            elementName = reader.Name;
            break;
        case XmlNodeType.Text:
            switch (elementName)
            {
            case "temp_c":
                temp = reader.ReadContentAsInt();
                break;
            case "relative_humidity":
                humidity = reader.ReadContentAsString();
                break;
            case "wind_string":
                wind = reader.ReadContentAsString();
                break;
            }
            elementName = null;
            break;
        }
    }
}
于 2012-04-22T01:24:40.357 に答える
0

これを試してみてください。これは最も洗練されたソリューションではありませんが、機能するはずです。

using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Xml;

namespace CNGS
{
    public class WeatherReader
    {
        public int Temp;
        public string Humidity;
        public string Wind;
        public string place;

        public void PopulateWeatherData()
        {
            XmlReader reader = XmlReader.Create("http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml");

            bool IsNextTemp = false;
            bool IsHumidityTemp = false;
            bool IsWindTemp = false;

            reader.MoveToContent();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element: // The node is an element.
                        if (reader.Name == "temp_c")
                        {
                            IsHumidityTemp = false;
                            IsWindTemp = false;
                            IsNextTemp = true;
                        }
                        else if (reader.Name == "relative_humidity")
                        {
                            IsHumidityTemp = true;
                            IsWindTemp = false;
                            IsNextTemp = false;
                        }
                        else if (reader.Name == "wind_string")
                        {
                            IsHumidityTemp = false;
                            IsWindTemp = true;
                            IsNextTemp = false;
                        }
                        else
                        {
                            IsHumidityTemp = false;
                            IsWindTemp = false;
                            IsNextTemp = false;
                        }
                        break;
                    case XmlNodeType.Text: //Display the text in each element.
                        if (IsHumidityTemp)
                            this.Humidity = reader.Value;
                        else if (IsNextTemp)
                            this.Temp = int.Parse(reader.Value);
                        else if (IsWindTemp)
                            this.Wind = reader.Value;
                        break;
                }

            }

            reader.Close();
        }
    }
}
于 2012-04-22T04:27:20.343 に答える
0

これは私のバージョンです:

XDocument doc = XDocument.Load("http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml");
var v = from d in doc.Element("response").Elements("current_observation") select new { Temp = d.Element("temp_c").Value, Humedity = d.Element("relative_humidity").Value, Wind = d.Element("wind_string").Value };
foreach (var c in v)
{
    Console.WriteLine(c.Temp);
}
于 2012-04-22T03:54:27.570 に答える