【问题标题】:5 Day Forecast using Nodes使用节点的 5 天预测
【发布时间】:2013-12-11 16:55:28
【问题描述】:

我已经设置了一个程序,它可以让我的天气正常 1 天,但我不知道如何获取其他 4 天的信息,因为在 xml 文件中,这些天都具有相同的名称。我如何访问不同日期的信息?

http://weather.yahooapis.com/forecastrss?w=2473224我正在使用的Xml

代码:

string query = String.Format("http://weather.yahooapis.com/forecastrss?w=2473224");
XmlDocument wData = new XmlDocument();
wData.Load(query);

XmlNamespaceManager manager = new XmlNamespaceManager(wData.NameTable);
manager.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0");

XmlNode channel = wData.SelectSingleNode("rss").SelectSingleNode("channel");
XmlNodeList nodes = wData.SelectNodes("/rss/channel/item/yweather:forecast", manager);

string temperature = channel.SelectSingleNode("item").SelectSingleNode("yweather:condition", manager).Attributes["temp"].Value;

string condition = channel.SelectSingleNode("item").SelectSingleNode("yweather:condition", manager).Attributes["text"].Value;

string humidity = channel.SelectSingleNode("yweather:atmosphere", manager).Attributes["humidity"].Value;

string WindSpeed = channel.SelectSingleNode("yweather:wind", manager).Attributes["speed"].Value;

string town = channel.SelectSingleNode("yweather:location", manager).Attributes["city"].Value;

string tfcond = channel.SelectSingleNode("item").SelectSingleNode("yweather:forecast", manager).Attributes["text"].Value;

string tfhigh = channel.SelectSingleNode("item").SelectSingleNode("yweather:forecast", manager).Attributes["high"].Value;

string tflow = channel.SelectSingleNode("item").SelectSingleNode("yweather:forecast", manager).Attributes["low"].Value;

好吧,我通过将值分配给这样的数组并使用这样的一些代码来解决这个问题。

var FiveDays = channel.SelectSingleNode("item").SelectNodes("yweather:forecast", manager); foreach(五天的 XmlNode 节点) { var day = node.Attributes["day"].Value; dayarray[i] = (day); // var text = node.Attributes["text"].Value; 文本数组[i] = (文本); 感谢您的所有帮助!

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    我相信您可以使用 XmlNode.SelectNodes 方法代替 SelectSingleNode。

    这将返回一个列表,然后您可以遍历该列表并将值复制到您需要的位置。

    var fiveDays = channel.SelectSingleNode("item").SelectNodes("yweather:forecast", manager);
    foreach (XmlNode node in fiveDays)
    {
        var text = node.Attributes["text"].Value;
        var high = node.Attributes["high"].Value;
        var low = node.Attributes["low"].Value;
    }
    

    【讨论】:

      【解决方案2】:

      这将为您提供未来几天的集合,然后您可以遍历它们以获取每一天的详细信息:

      var upcomingDays = channel.SelectSingleNode("item").SelectNodes("yweather:forecast", manager);
      
      foreach(XmlNode d in upcomingDays)
      {
          //d.Attributes["day"].Value;
      }
      

      我在 LINQPad 中运行了它,它运行良好。

      【讨论】:

      • 您也可以使用 xpath wData.SelectNodes("channel/item//yweather:forcast", manager) 返回一个 XmlNodeList。
      • @LeeHiles 是的,但我想我会保持 OP 的结构方式
      【解决方案3】:

      如果您使用像 XmlSerializer 和类这样的反序列化器,这会容易得多。具有以下类:

      [XmlRoot("rss")]
      public class RssRoot
      {
          [XmlElement("channel")]
          public Channel Channel { get; set; }
      }
      public class Channel
      {
          [XmlElement("item")]
          public Item Item { get; set; }
          // add other properties, if relevant
      }
      public class Item
      {
          [XmlElement("title")]
          public string Title { get; set; }
          [XmlElement("forecast", Namespace="http://xml.weather.yahoo.com/ns/rss/1.0")]
          public List<Forecast> Forecasts { get; set; }
          // add other properties, if relevant
      }
      public class Forecast
      {
          [XmlAttribute("text")]
          public string Text { get; set; }
          // add other attributes, if relevant
      }
      

      这将从query中的URL获取您的数据

      string query = "http://weather.yahooapis.com/forecastrss?w=2473224";
      using (var reader = XmlReader.Create(query))
      {
          var ser = new XmlSerializer(typeof(RssRoot));
          var rss = (RssRoot)ser.Deserialize(reader);
          // use rss
      }
      

      如果您想继续使用 XmlDocument 处理 XML,您应该使用 SelectNodes 获取多个 forecast 节点,而不是获取单个节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2022-12-13
        • 2015-02-28
        • 1970-01-01
        • 2019-08-18
        • 2020-01-23
        • 1970-01-01
        相关资源
        最近更新 更多