package com.lolaage.tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xmlpull.v1.XmlPullParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.util.Xml;
import com.lolaage.app.application.PETApplication;
import com.lolaage.entity.WeatherInfo;
import com.lolaage.entity.WeatherNextInfo;
public class WeatherUtil {
private static WeatherUtil instance;
private String cacheFile;//存放天气缓存的文件名
private Map<String, WeatherInfo> weather;//按城市区分保存天气缓存
private static String USER_AGENT = "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.11) Gecko/20101031 Gentoo Firefox/3.6.11";
private WeatherUtil(){
cacheFile = PETApplication.getContext().getCacheDir().toString() + "/weathers";
}
public static WeatherUtil getInstance(){
if(instance == null){
instance = new WeatherUtil();
}
return instance;
}
/**
* 保存天气缓存
* @param weather
* @return:保存结果
*/
public boolean saveWeathers(Map<String, WeatherInfo> weather){
this.weather = weather;
return save(weather,cacheFile);
}
private boolean save(Object obj,String path) {
FileOutputStream outputStream = null;
ObjectOutputStream objectOutputStream = null;
try {
outputStream = new FileOutputStream(path);
//ObjectOutputStream 将基本数据类型和图形写入 OutputStream,并且对网络数据所保存的对象要实现序列化
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return true;
} catch (Exception e) {
return false;
}finally{
if(outputStream != null || objectOutputStream != null){
try {
objectOutputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取缓存中的天气
* @return
*/
public WeatherInfo loadWeather(){
WeatherInfo info = null;
if(weather == null){
weather = (Map<String, WeatherInfo>) load(cacheFile);
}
if(weather != null){
//获取缓存天气城市的遍历器
Iterator<String> iterator = weather.keySet().iterator();
while (iterator.hasNext()) {
String city = iterator.next();//获取节点
info = weather.get(city);
info.city = city;
}
}else {
weather = new HashMap<String, WeatherInfo>();
}
return info;
}
private Object load(String path){
Object object = null;
File file = new File(path);
FileInputStream isFileInputStream = null;
ObjectInputStream objectInputStream = null;
try {
if(file.exists()){
isFileInputStream = new FileInputStream(file);
objectInputStream = new ObjectInputStream(isFileInputStream);
object = objectInputStream.readObject();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(isFileInputStream != null || objectInputStream != null){
objectInputStream.close();
isFileInputStream.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return object;
}
/**
* 清空缓存
*/
public void clearCacheWeather(){
new File(cacheFile).delete();
}
/**
* 取得天气信息
* @param url
*/
public static WeatherInfo getWeatherMes(String url,double latitude,double longitude){
WeatherInfo weatherInfo = new WeatherInfo();
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest request = new HttpGet(url);
//设置请求头(用来解决网络获取数据乱码问题)
request.setHeader("User-Agent",USER_AGENT);
request.setHeader("Accept-Encoding", "gzip,deflate");
HttpResponse response = null;
InputStream inputStream = null;
try {
response = client.execute(request);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
//判断返回的请求头(解决乱码)
Header header = response.getFirstHeader("Content-Encoding");
if(header != null && header.getValue().toLowerCase().indexOf("gzip") > -1){
inputStream = new GZIPInputStream(inputStream);
}
//解析
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new InputSource(inputStream));
NodeList nodeList = document.getElementsByTagName("forecast_information");
//取得当天日期
String date = nodeList.item(0).getChildNodes().item(4).getAttributes().item(0).getNodeValue();
NodeList nodeList2 = document.getElementsByTagName("current_conditions");
//取得当天天气、湿度、图片、风速
String condition = nodeList2.item(0).getChildNodes().item(0).getAttributes().item(0).getNodeValue();
String humidity = nodeList2.item(0).getChildNodes().item(3).getAttributes().item(0).getNodeValue();
String icon = nodeList2.item(0).getChildNodes().item(4).getAttributes().item(0).getNodeValue();
String wind = nodeList2.item(0).getChildNodes().item(5).getAttributes().item(0).getNodeValue();
NodeList nodeList3 = document.getElementsByTagName("forecast_conditions");
//取得当天的星期、温度
String week = nodeList3.item(0).getChildNodes().item(0).getAttributes().item(0).getNodeValue();
String low = nodeList3.item(0).getChildNodes().item(1).getAttributes().item(0).getNodeValue();
String high = nodeList3.item(0).getChildNodes().item(2).getAttributes().item(0).getNodeValue();
weatherInfo.city = getCityForlola(Constant.CITY_API, latitude, longitude);
weatherInfo.date = date;
weatherInfo.condition = condition;
weatherInfo.humidity = humidity;
weatherInfo.icon = icon;
weatherInfo.wind = wind;
weatherInfo.week = week;
weatherInfo.highTemp = high;
weatherInfo.lowTemp = low;
WeatherNextInfo nextInfo;
//取得今后3天的天气情况
for (int i = 1; i < nodeList3.getLength(); i++) {
nextInfo = new WeatherNextInfo();
nextInfo.week = nodeList3.item(i).getChildNodes().item(0).getAttributes().item(0).getNodeValue();
nextInfo.low = nodeList3.item(i).getChildNodes().item(1).getAttributes().item(0).getNodeValue();
nextInfo.high = nodeList3.item(i).getChildNodes().item(2).getAttributes().item(0).getNodeValue();
nextInfo.icon = nodeList3.item(i).getChildNodes().item(3).getAttributes().item(0).getNodeValue();
nextInfo.condition = nodeList3.item(i).getChildNodes().item(4).getAttributes().item(0).getNodeValue();
weatherInfo.nextWeatherList.add(nextInfo);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(inputStream != null){
inputStream.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return weatherInfo;
}
/**
* 根据经纬度解析城市
* @param url
* @param latitude
* @param longitude
* @return
*/
public static String getCityForlola(String url,double latitude,double longitude){
String city = "";
String formatUrl = String.format(url, latitude,longitude);
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest request = new HttpGet(formatUrl);
request.setHeader("User-Agent",USER_AGENT);
request.setHeader("Accept-Encoding","gzip,deflate");
HttpResponse response = null;
InputStream inputStream = null;
try {
response = client.execute(request);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
Header header = response.getFirstHeader("Content-Encoding");
if(header != null && header.getValue().toLowerCase().indexOf("gzip") > -1){
inputStream = new GZIPInputStream(inputStream);
}
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG://开始解析标签元素
if(parser.getName().equalsIgnoreCase("LocalityName")){
city = parser.nextText();//取得节点后面的text值
}
break;
case XmlPullParser.END_TAG:
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(inputStream != null){
inputStream.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return city;
}
/**
* 日期格式化
* @param str
* @return
* @throws ParseException
*/
public static String dateFormat(String str){
Date date = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
if(str != null && !"".equals(str)){
try {
date = df.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日");
return sdf.format(date);
}
/**
*
* @param str
* @return
*/
public static String weekFormat(String str){
String week = "";
if(str != null && !"".equals(str)){
if(str.startsWith("周")){
week = str.replaceFirst("周", "星期");
}
}
return week;
}
/**
* 返回天气图标
* @param iconUrl
* @return
*/
public static Bitmap returnIcon(String iconUrl){
URL imgUrl = null;
Bitmap bp = null;
HttpURLConnection connection = null;
InputStream inputStream = null;
try {
imgUrl = new URL(iconUrl);
connection = (HttpURLConnection) imgUrl.openConnection();
connection.setDoInput(true);
connection.connect();
inputStream = connection.getInputStream();
bp = BitmapFactory.decodeStream(inputStream);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(inputStream != null || connection != null){
inputStream.close();
connection.disconnect();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return bp;
}
}
/**
* 天气预报访问接口
*/
public static final String WEATHER_URL = "http://www.google.com/ig/api?hl=zh-cn&weather";
/**
* 获取城市名访问接口
*/
public static final String CITY_API = "http://ditu.google.cn/maps/geo?output=xml&key=abc&q=%s,%s";
分享到:
相关推荐
本项目名为“天气预报 .xml文件解析”,其核心在于利用XML文件来存储天气预报数据,并通过编程手段进行解析,结合SQLite数据库展示和管理这些信息。 首先,我们要理解XML的基本结构。XML是一种自描述性的标记语言,...
在本案例中,我们将利用XMLHTTP来获取并显示天气预报信息,这涉及到的技术主要包括Ajax、JSON格式数据处理以及DOM操作。 首先,Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许在不重新...
5. **HTML和CSS**:`weather.html`文件可能是用来构建天气预报显示页面的。HTML(HyperText Markup Language)负责网页的结构,而CSS(Cascading Style Sheets)则用于定义网页的样式和布局。你需要理解如何使用这两...
最后,压缩包中的"Weather"文件很可能是示例的天气预报XML数据。通过实际解析这个文件,你可以更直观地理解SAX和PULL在处理真实数据时的工作流程。在实践中,记得先理解XML数据的结构,然后根据需求选择合适的解析器...
本项目"天气预报天气预报天气预报"是一款用C#编写的简单天气预报应用,非常适合初学者学习和实践。 1. **C#基础** 在开发这个天气预报程序之前,我们需要对C#的基本语法、类库和面向对象编程有基本理解。这包括...
【标题】"天气预报WebService实例"是一个基于网络服务的项目,旨在提供实时的天气信息查询功能。WebService是一种通过互联网交换结构化信息的标准,它允许不同的应用程序之间进行交互,无论它们运行在何种操作系统或...
【标题】"Web服务天气预报"揭示了这个项目的核心是利用Web服务来获取并展示天气预报信息。在现代信息技术中,Web服务是一种基于互联网的、允许不同应用系统之间进行交互的技术。它通常采用如XML(可扩展标记语言)或...
【Android Studio天气预报】是一个基于Android Studio开发的简单天气应用项目。这个项目的核心在于`main`文件,它包含了应用程序的主要逻辑。在Android开发中,`main`通常指的是`MainActivity`,这是应用程序启动时...
**标题详解:** "仿百度天气预报样式的echart静态html实例" 这个标题指出,我们将会讨论一个使用ECharts图表库创建的HTML页面,该页面模仿了百度天气预报的样式。ECharts是一个由百度开发的开源JavaScript图表库,...
5. 数据解析:天气预报数据通常是JSON格式,需要使用QT的QJson库进行解析,将数据转换为可操作的结构。 6. 多线程:为了不影响用户界面的响应,获取天气数据的过程可能需要在后台线程中执行,这就需要用到QT的...
在本例中,“webservice天气预报例子cxf实例”指的是使用Apache CXF框架实现的一个天气预报相关的Web服务示例。 Apache CXF是一个开源框架,它为开发和部署Web服务提供了全面的支持。CXF允许开发者通过Java编程模型...
- `weatherWidget`:这个文件可能是整个天气预报组件的JavaScript源代码,包含了获取数据、解析数据、更新DOM和添加动画等功能的实现。通过阅读和理解这个文件,可以深入学习如何将HTML、CSS和JavaScript有效地结合...
在这个特定的项目中,我们关注的是如何使用Web Service来获取天气预报信息,特别是通过解析WSDL(Web Services Description Language)文件。WSDL是一种XML格式,用于定义服务的位置、接口以及如何调用这些服务。 ...
从压缩包文件名称来看,“weather”很可能包含了实现天气预报功能的所有必要文件,如插件安装文件、配置文件、CSS样式表、JavaScript脚本以及可能的数据库连接文件等。这些文件通常包括: 1. 插件主文件(如 plugin...
该文件主要介绍了 Android 应用程序开发课程天气预报软件的需求分析报告,涵盖了软件开发中的各个方面,包括需求定义、软件设计、系统功能需求、接口设计、数据存储、安全性需求、性能需求、软件质量属性等。...
【Android Studio项目《天气预报app》详解】 在移动开发领域,Android Studio是Google推出的一款集成开发环境(IDE),专门用于构建Android应用。本项目《天气预报app》是基于Android Studio开发的一个实例,它展示...
3. Servlet接收到请求后,读取XML天气预报文件,使用DOM或SAX解析器找到对应的省份数据。 4. 解析出城市列表,将其转换为JSON或其他格式,然后通过HttpServletResponse响应给前端。 5. 前端接收到响应后,更新城市...
【标题】:“Domino AJAX 天气预报” 在IT领域,尤其是Web开发中,"Domino AJAX 天气预报"是指使用IBM Domino服务器作为后端,并结合AJAX(Asynchronous JavaScript and XML)技术来实现一个基于浏览器(Browser-...
【Rss全国各省市天气预报】项目是一个利用RSS(Really Simple Syndication)技术获取并解析全国各地天气信息的应用。RSS是一种基于XML的格式,用于发布和订阅新闻、博客、天气等实时信息,使得用户能轻松地获取和...
【安卓天气预报项目源代码】是一个面向Android平台的软件开发项目,主要目标是实现一个能够实时获取并显示天气信息的应用程序。这个项目涉及到的技术点涵盖了Android应用开发的基础和进阶内容,包括用户界面设计、...