解析类
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyWeatherHandler extends DefaultHandler{
private String main_condition; //天气情况
private Integer temprature; //气温
private String humidity; //湿度
private String wind; //风况
private String icon; //图片地址
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(localName.equals("condition")){
String value = attributes.getValue("data"); //获得天气总情况
setMain_condition(value); //设置天气总情况
}
else if(localName.equals("temp_c")){ //
String value = attributes.getValue("data"); //获得气温
setTemprature(Integer.valueOf(value)); //将气温值设置到成员变量
}
else if(localName.equals("humidity")){
String value = attributes.getValue("data"); //获得湿度
setHumidity(value); //将湿度值设置到成员变量
}
else if(localName.equals("wind_condition")){
String value = attributes.getValue("data"); //获取风况
setWind(value); //将风况值设置到成员变量
}
else if(localName.equals("icon")){
String value = attributes.getValue("data"); //获取图标
setIcon(value); //将图标值设置到成员变量
}
}
public String getMain_condition() {
return main_condition;
}
public void setMain_condition(String mainCondition) {
main_condition = mainCondition;
}
public Integer getTemprature() {
return temprature;
}
public void setTemprature(Integer temprature) {
this.temprature = temprature;
}
public String getHumidity() {
return humidity;
}
public void setHumidity(String humidity) {
this.humidity = humidity;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
}
主Activity
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnGo = (Button)findViewById(R.id.btnGo);
btnGo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText etCity = (EditText)findViewById(R.id.etCity);
String sCity = etCity.getEditableText().toString().trim(); //获得EditText控件内容
if(sCity.equals("")){ //判断输入的城市名是否为空
Toast.makeText(Main.this, "请输入正确的城市名称!", Toast.LENGTH_LONG).show();
return;
}
try{
String urlStr = "http://www.google.com/ig/api?weather=" + sCity;
urlStr = urlStr.replaceFirst(" ", "%20"); //替换空格为 %20
URL weatherUrl = new URL(urlStr);
parseWeatherInfo(weatherUrl); //调用方法解析天气信息
}
catch(Exception e){
e.printStackTrace();
}
}
});
}
//方法:解析天气信息
public void parseWeatherInfo(URL url){
try {
SAXParserFactory sf = SAXParserFactory.newInstance(); //创建SAXParserFactory对象
SAXParser sp = sf.newSAXParser(); //创建SAXParser对象
XMLReader xr = sp.getXMLReader(); //获得XMLReader对象
MyWeatherHandler mwh = new MyWeatherHandler(); //创建解析XML内容的MyWeatherHandler对象
xr.setContentHandler(mwh); //设置XMLReader的Handler
xr.parse(new InputSource(url.openStream())); //解析XML文件
StringBuilder sb = new StringBuilder();
sb.append(mwh.getMain_condition());
sb.append("\n");
sb.append(mwh.getTemprature());
sb.append("\n");
sb.append(mwh.getHumidity());
sb.append("\n");
sb.append(mwh.getWind());
TextView tv = (TextView)findViewById(R.id.tvResult);
tv.setText(sb.toString());
URL iconUrl = new URL("http://www.google.com"+mwh.getIcon()); //生成图片路径
URLConnection con = iconUrl.openConnection();
InputStream in = con.getInputStream();
Bitmap bmp = BitmapFactory.decodeStream(in);
ImageView iv = (ImageView)findViewById(R.id.ivResult); //获得ImageView对象
iv.setImageBitmap(bmp); //设置ImageView的图片
}
catch (Exception e) { //捕获并打印异常
e.printStackTrace();
}
}
}