<?xml version="1.0" encoding="UTF-8"?>
<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="Qingdao, Shandong" />
<postal_code data="Qingdao" />
<latitude_e6 data="" />
<longitude_e6 data="" />
<forecast_date data="2012-04-17" />
<current_date_time data="2012-04-18 02:00:00 +0000" />
<unit_system data="SI" />
</forecast_information>
<current_conditions>
<condition data="晴" />
<temp_f data="52" />
<temp_c data="11" />
<humidity data="湿度: 33%" />
<icon data="/ig/images/weather/sunny.gif" />
<wind_condition data="风向: 南、风速:7 米/秒" />
</current_conditions>
<forecast_conditions>
<day_of_week data="周二" />
<low data="7" />
<high data="19" />
<icon data="/ig/images/weather/mostly_sunny.gif" />
<condition data="以晴为主" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周三" />
<low data="7" />
<high data="16" />
<icon data="/ig/images/weather/mostly_sunny.gif" />
<condition data="晴间多云" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周四" />
<low data="7" />
<high data="17" />
<icon data="/ig/images/weather/cn_fog.gif" />
<condition data="雾" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周五" />
<low data="8" />
<high data="17" />
<icon data="/ig/images/weather/cn_fog.gif" />
<condition data="雾" />
</forecast_conditions>
</weather>
</xml_api_reply>
首先是Google天气的api.xml
// 2012-4-17下午07:09:03
package com.su.weatherxml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;
public class PULLMode {
private static final String TAG = "PULLMODE";
public HashMap<String, String> getCurrentInfo(InputStream inStream)
throws Throwable {
Log.i(TAG, "1");
HashMap<String, String> infoMap = new HashMap<String, String>();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();// 产生第一个事件
Log.i(TAG, eventType + "");
while (eventType != XmlPullParser.END_DOCUMENT) {// 只要不是文档结束事件
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String name = parser.getName();// 获取解析器当前指向的元素的名称
if ("city".equals(name)) {
infoMap.put("city", parser.getAttributeValue(0));// 获取解析器当前指向元素的下一个文本节点的值
}
if ("wind_condition".equals(name)) {
infoMap.put("wind_condition", parser.getAttributeValue(0));
}
break;
case XmlPullParser.END_TAG:
if ("xml_api_reply".equals(parser.getName())) {
Iterator iter = infoMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = entry.getKey().toString();
String val = entry.getValue().toString();
Log.i(TAG, key + " " + val);// 遍历hashmap方法输出信息
}
break;
}
}
eventType = parser.next();// 每个节点都要进行判断
}
return infoMap;
}
public List<WeatherBean> getWeatherBeans(InputStream inStream)
throws Throwable {
List<WeatherBean> wheatherBeans = null;
WeatherBean wheatherBean = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();// 产生第一个事件
while (eventType != XmlPullParser.END_DOCUMENT) {// 只要不是文档结束事件就进行循环
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
wheatherBeans = new ArrayList<WeatherBean>();
break;
case XmlPullParser.START_TAG:
String name = parser.getName();// 获取解析器当前指向的元素的名称
if ("forecast_conditions".equals(name))
wheatherBean = new WeatherBean();
if (wheatherBean != null) {// 只有当whetherBean被new后才执行这里 向里面添加数据
if ("day_of_week".equals(name)) {
wheatherBean.setDayofweek(parser.getAttributeValue(0));
Log.i(TAG, parser.getAttributeValue(0));
// parser还有很多其他的方法 比如nextText();
}
if ("low".equals(name)) {
wheatherBean.setLow(new Integer(parser
.getAttributeValue(0)));
Log.i(TAG, parser.getAttributeValue(0));
}
if ("high".equals(name)) {
wheatherBean.setHigh(new Integer(parser
.getAttributeValue(0)));
Log.i(TAG, parser.getAttributeValue(0));
}
if ("condition".equals(name)) {
wheatherBean.setCondition(parser.getAttributeValue(0));
Log.i(TAG, parser.getAttributeValue(0));
}
}
break;
case XmlPullParser.END_TAG:
if ("forecast_conditions".equals(parser.getName())) {
wheatherBeans.add(wheatherBean);
wheatherBean = null;
}
break;
}
eventType = parser.next();
}
return wheatherBeans;
}
}
PULL解析的方法;由于api.xml的前面几行不是很对称,所以把前面的信息存贮在了map中,后面的存储在list<WeatherBean>
// 2012-4-17下午08:41:38
package com.su.weatherxml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
public class SAXMode {
public static final String TAG = "SAXmode";
public HashMap<String, String> getCurrentInfo(InputStream inStream)
throws Throwable {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
mWeatherParser mweatherParser = new mWeatherParser();
parser.parse(inStream, mweatherParser);
inStream.close();
return mweatherParser.getWeatherBeans();
}
private final class mWeatherParser extends DefaultHandler {
private HashMap<String, String> infoMap = new HashMap<String, String>();;
private String tag = null;
public HashMap<String, String> getWeatherBeans() {
return infoMap;
}
@Override
public void startDocument() throws SAXException {// 开始文件
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (infoMap != null) {
if ("city".equals(localName)) {
infoMap.put("city", attributes.getValue(0));
Log.i(TAG, attributes.getValue(0));
}
if ("wind_condition".equals(localName)) {
infoMap.put("wind_condition",
attributes.getValue(0));
Log.i(TAG, attributes.getValue(0));
}
}
tag = localName;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {// 遇到文字(标签之间)
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {// 结束节点
tag = null;
}
}
public List<WeatherBean> getWeatherBeans(InputStream inStream)
throws Throwable {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
WeatherParser weatherParser = new WeatherParser();
parser.parse(inStream, weatherParser);
inStream.close();
return weatherParser.getWeatherBeans();
}
private final class WeatherParser extends DefaultHandler {
private List<WeatherBean> weatherBeans = null;
private String tag = null;
private WeatherBean weatherBean = null;
public List<WeatherBean> getWeatherBeans() {
return weatherBeans;
}
@Override
public void startDocument() throws SAXException {// 开始文件
weatherBeans = new ArrayList<WeatherBean>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("forecast_conditions".equals(localName)) {// 开始解析节点(标签)
weatherBean = new WeatherBean();
}
if (weatherBean != null) {
if ("day_of_week".equals(localName)) {
weatherBean.setDayofweek(attributes.getValue(0));
Log.i(TAG, attributes.getValue(0));
}
if ("low".equals(localName)) {
weatherBean.setLow(new Integer(attributes.getValue(0)));
}
if ("high".equals(localName)) {
weatherBean.setHigh(new Integer(attributes.getValue(0)));
}
if ("condition".equals(localName)) {
weatherBean.setCondition(attributes.getValue(0));
}
}
tag = localName;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {// 遇到文字(标签之间)
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {// 结束节点
if ("forecast_conditions".equals(localName)) {
weatherBeans.add(weatherBean);
weatherBean = null;
}
tag = null;
}
}
}
SAX解析