2012-04-22 21 views
2

xmlファイルは次の場所にあります。http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xmlXMLデータを解析して子ノードの値を取得する方法は?

ここでは値をtemp_c, relative_humidity, wind_stringに取得したいと考えています。私は

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

それは正しいです、それが必要な値を取得します

としてクラスWeatherReader.csを作成していることについては

私はこの情報を銀色のページに表示したいからです。私は

WeatherReader Weath = new WeatherReader(); 

としてクラスweatherreaderのオブジェクトを作成しようとしましたが、私は一時、風値などを取得する方法がわかりませんか? int tmp = Weath.Tempのようなものは動作していません。

助けてください

私は気象データを取得し、その後ライブ天気予報を表示するには、メインページ上のSilverlightコントロールでそれを使用したいと思います。

おかげ

答えて

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

取得すると、エラー:「『http://api.wunderground.com/api/adaebe40743a9ca6/geolookup/conditions/forecast/q/India/Pilani.xml』を開くことができませんURIパラメータは、相対パスでなければなりませんSilverlightアプリケーションのXAPパッケージ内のコンテンツを指しています。任意のUriからコンテンツをロードする必要がある場合は、WebClient/HttpWebRequestを使用してXMLコンテンツを読み込むドキュメントを参照してください。 – HL88

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); 
} 
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(); 
     } 
    } 
} 
関連する問題