我的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();
}
}
}
是否正确,是否会获取所需的值?
现在我想在银色页面中显示这些信息。我试图创建一个类天气阅读器的对象
WeatherReader Weath = new WeatherReader();
但我不知道如何获取Temp,Wind值等?没有像int tmp = Weath.Temp
那样的工作。
请帮助
我想获取天气数据,然后在MainPage上的silverlight控件中使用它来显示实时天气报告。
由于
答案 0 :(得分: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;
}
}
}
答案 1 :(得分: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);
}
答案 2 :(得分: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();
}
}
}