在android平台下操作xml方式有很多种,常见的为SAX(Simple APIfor XML)和DOM(Document Object Model)。
SAX操作xml的特点是当读取xml文件的时候会随时触发事件,通过事件来处理当前读取到的内容。这一点是跟dom有所不同的,dom是全部读取完后在进行操作。
现在这个实例是以SAX进行XML操作的!
这个例子是读取Google的天气预报为例子做成了,使用的XML地址如下:http://www.google.com/ig/api?weather=beijing&hl=zh-cn
通过互联网获取天气的XML代码,然后再通过SAX进行读取:
在例子中只是读取了当前的时时天气,没有对预报的内容进行读取,等以后再完善吧:
首先根据XML文件抽象出一个类来,我获取到的XML代码如下:
- <?xml version="1.0" ?>
- <xml_api_reply version="1">
- <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1"
- row="0" section="0">
- <forecast_information>
- <city data="Beijing, Beijing" />
- <postal_code data="beijing" />
- <latitude_e6 data="" />
- <longitude_e6 data="" />
- <forecast_date data="2010-12-27" />
- <current_date_time data="2010-12-28 04:00:00 +0000" />
- <unit_system data="SI" />
- </forecast_information>
- <current_conditions>
- <condition data="晴" />
- <temp_f data="28" />
- <temp_c data="-2" />
- <humidity data="湿度: 27%" />
- <icon data="/ig/images/weather/sunny.gif" />
- <wind_condition data="风向: 西北、风速:7 米/秒" />
- </current_conditions>
- <forecast_conditions>
- <day_of_week data="周一" />
- <low data="-12" />
- <high data="6" />
- <icon data="/ig/images/weather/sunny.gif" />
- <condition data="晴" />
- </forecast_conditions>
- <forecast_conditions>
- <day_of_week data="周二" />
- <low data="-11" />
- <high data="1" />
- <icon data="/ig/images/weather/sunny.gif" />
- <condition data="晴" />
- </forecast_conditions>
- <forecast_conditions>
- <day_of_week data="周三" />
- <low data="-11" />
- <high data="2" />
- <icon data="/ig/images/weather/chance_of_snow.gif" />
- <condition data="可能降雪" />
- </forecast_conditions>
- <forecast_conditions>
- <day_of_week data="周四" />
- <low data="-13" />
- <high data="-2" />
- <icon data="/ig/images/weather/sunny.gif" />
- <condition data="晴" />
- </forecast_conditions>
- </weather>
- </xml_api_reply>
- package com.SAXXMLReader;
- public class NowWeather {
- private String condition;
- private String temp_f;
- private String temp_c;
- private String humidity;
- private String icon;
- private String wind_condition;
- public NowWeather() {
- }
- public void setcondition(String condition) {
- this.condition = condition;
- }
- public void settempf(String temp_f) {
- this.temp_f = temp_f;
- }
- public void settempc(String temp_c) {
- this.temp_c = temp_c;
- }
- public void sethumidity(String humidity) {
- this.humidity = humidity;
- }
- public void seticon(String icon) {
- this.icon = icon;
- }
- public void setwindcondition(String wind_condition) {
- this.wind_condition = wind_condition;
- }
- public String getNowWeather()
- {
- StringBuilder strBuilder = new StringBuilder();
- strBuilder.append(condition+"\n");
- strBuilder.append(temp_f+"\n");
- strBuilder.append(temp_c+"\n");
- strBuilder.append(humidity+"\n");
- strBuilder.append(icon+"\n");
- strBuilder.append(wind_condition+"\n");
-
- return strBuilder.toString();
- }
- }
- package com.SAXXMLReader;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- import android.util.Log;
- public class WeatherHandler extends DefaultHandler {
- private final String CURRENT_CONDITIONS = "current_conditions"; // 当前
- private final String forecast_conditions = "forecast_conditions"; // 当前
- // 实时天气信息
- private boolean is_Current_Conditions = false;
- // 预报天气信息
- private boolean is_Forecast_Conditions = false;
- NowWeather nowWeather = new NowWeather();
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- // TODO Auto-generated method stub
- super.characters(ch, start, length);
- }
- @Override
- public void startDocument() throws SAXException {
- // TODO Auto-generated method stub
- super.startDocument();
- }
- public WeatherHandler() {
- }
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- // TODO Auto-generated method stub
- // super.startElement(uri, localName, qName, attributes);
- String dataAttribute = "OK";
- // Log.d("WeatherHandler", localName);
- if (localName.equals(CURRENT_CONDITIONS)) {
- Log.d("WeatherHandler", localName);
- is_Current_Conditions = true;
- } else if (localName.equals(forecast_conditions)) {
- is_Current_Conditions = false;
- } else {
- dataAttribute = attributes.getValue("data");
- if (this.is_Current_Conditions) {
- Log.d("WeatherHandler_1", dataAttribute);
- // this.nowWeather.setcondition(dataAttribute);
- if (localName.equals("condition")) {
- this.nowWeather.setcondition(dataAttribute);
- } else if (localName.equals("temp_f")) {
- this.nowWeather.settempf(dataAttribute);
- } else if (localName.equals("temp_c")) {
- this.nowWeather.settempc(dataAttribute);
- } else if (localName.equals("humidity")) {
- this.nowWeather.sethumidity(dataAttribute);
- } else if (localName.equals("icon")) {
- this.nowWeather.seticon(dataAttribute);
- } else if (localName.equals("wind_condition")) {
- this.nowWeather.setwindcondition(dataAttribute);
- }
- } else if (this.is_Forecast_Conditions) {
- Log.d("WeatherHandler_1", dataAttribute);
- }
- }
- // Log.d("WeatherHandler_1", dataAttribute);
- }
- public String getNowWeather() {
- return nowWeather.getNowWeather();
- }
- @Override
- public void endDocument() throws SAXException {
- // TODO Auto-generated method stub
- super.endDocument();
- }
- @Override
- public void endElement(String uri, String localName, String name)
- throws SAXException {
- }
- }
- SAXParserFactory faction =SAXParserFactory.newInstance();
- SAXParser parser = faction.newSAXParser();
- WeatherHandler handler = new WeatherHandler();
- XMLReader reader = parser.getXMLReader();
- reader.setContentHandler(handler);
- URL url = new URL(SRC);
- HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
- //httpconn.getInputStream();
- InputStream inStream =httpconn.getInputStream();// this.getResources().openRawResource(R.xml.weather);
- InputStreamReader isReader = new InputStreamReader(inStream,"GBK");
- //BufferedReader buffRreader = new BufferedReader(isReader);
- //String line="";
- //String data = "";
- //
- //while((line=buffRreader.readLine())!=null)
- // data += line;
- //text1.setText(data);
- //Toast.makeText(this,data, Toast.LENGTH_LONG).show();
- InputSource inputSource = new InputSource(isReader);
- reader.parse(inputSource);
- text1.setText(handler.getNowWeather());
- //Toast.makeText(this, handler.getNowWeather(), Toast.LENGTH_LONG).show();