注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Get weather from Yahoo (Use Scala)  

2011-10-14 21:46:16|  分类: Scala |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
公司被IBM收购了,心里很烦,担心自己是否会被fire,不过担心也没用。
开始玩玩Scala。
用Scala写了一个简单的练习,就是从Yahoo 取天气信息,体验一下Scala强大的表现力。

1.取得数据源
在你喜欢的浏览器中输入下面的URL
http://weather.yahooapis.com/forecastrss?w=2157249&u=c
就可以得到XML数据了 w参数表示地点 2157249 表示西安
你可以在这里得到其他城市的ID信息,最好将它导入数据库这样就很好查了
写一个Scala 方法
private def getLastestWeatherDataByWordId(worldId: Int) = {
    //world id 2157249 means xi'an
    val url = "http://weather.yahooapis.com/forecastrss?w=" + worldId + "&u=c"
    val data = scala.io.Source.fromURL(url).mkString
    data
  }

2.分析数据源并解析
使用Scala的XMl类解析xml很方便
private def parseData(data: String) = {
    val elem = XML.loadString(data)
   
    val location = elem \\ "location"
    val units = elem \\ "units"
    val condition = elem \\ "condition"
    val weatherMap = Map[String, String]("location" -> location(0).attribute("city").mkString,
      "unit" -> units(0).attribute("temperature").mkString,
      "weatherDesc" -> condition(0).attribute("text").mkString,
      "temperature" -> condition(0).attribute("temp").mkString,
      "date" -> condition(0).attribute("date").mkString)
    weatherMap
  }


3.得到自己想要的然后输出
调用上面的方法,得到自己想要的输出
def getWeatherStringByWorldId(worldId: Int) = {
      val weatherMap = parseData(getLastestWeatherDataByWordId(worldId))
     
      weatherMap("date") + "\n" + weatherMap("location") + " " + weatherMap("weatherDesc") +
      "\n" + weatherMap("temperature") + weatherMap("unit")
  }


是不是很简单,绝对比Java简洁吧。

完整代码:
package com.platform.weather

import scala.xml.XML
import scala.xml.Elem
import scala.xml.Node

object WeatherFinder {
  private def getLastestWeatherDataByWordId(worldId: Int) = {
    //world id 2157249 means xi'an
    val url = "http://weather.yahooapis.com/forecastrss?w=" + worldId + "&u=c"
    val data = scala.io.Source.fromURL(url).mkString
    data
  }

  private def parseData(data: String) = {
    val elem = XML.loadString(data)
   
    val location = elem \\ "location"
    val units = elem \\ "units"
    val condition = elem \\ "condition"
    val weatherMap = Map[String, String]("location" -> location(0).attribute("city").mkString,
      "unit" -> units(0).attribute("temperature").mkString,
      "weatherDesc" -> condition(0).attribute("text").mkString,
      "temperature" -> condition(0).attribute("temp").mkString,
      "date" -> condition(0).attribute("date").mkString)
    weatherMap
  }

  def getWeatherStringByWorldId(worldId: Int) = {
      val weatherMap = parseData(getLastestWeatherDataByWordId(worldId))
     
      weatherMap("date") + "\n" + weatherMap("location") + " " + weatherMap("weatherDesc") +
      "\n" + weatherMap("temperature") + weatherMap("unit")
  }

}

测试类
package com.platform.weather

object TestWeather {

  def main(args: Array[String]): Unit = {
    var data = WeatherFinder.getWeatherStringByWorldId(2157249);
    println(data);
  }

}


Console 输出
Fri, 14 Oct 2011 8:00 pm CST
Xi'an Clear
16C


如果可以的话,可以考虑JavaFX2.0制作前端界面。


参考资料
1.http://developer.yahoo.com/weather/
2.http://ihacklog.com/l.php?url=http%3A%2F%2Fdeveloper.yahoo.com%2Fgeo%2Fgeoplanet%2Fdata%2F
3.http://ihacklog.com/java/learning-java-get-weather-report-via-yahoo-weather-api.html
  评论这张
 
阅读(475)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017