package com.cn.tian.saxparse;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import com.cn.tian.domain.GForecastConditions;
import com.cn.tian.domain.GoogleWeather;
/**
* SAX解析器
* @author Administrator
*
*/
public class GoogleWeatherHandler extends DefaultHandler{
//private Handler handler;
private GoogleWeather googleWeather;
private List<GForecastConditions> forecastConditions;
private GForecastConditions gfc;
//判断是否读取未来几天的天气预报
private boolean forecastTag = false;
public GoogleWeatherHandler(){
//this.handler = handler;
}
@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 endDocument() throws SAXException {
System.out.println("end");
googleWeather.setForecastConditions(forecastConditions);
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putSerializable("weather", googleWeather);
message.setData(bundle);
message.what = 1;
//handler.sendMessage(message);
}
/**
* 本方法在解析文档开始时调用
*/
@Override
public void startDocument() throws SAXException {
System.out.println("beigin");
forecastConditions = new ArrayList<GForecastConditions>();
googleWeather = new GoogleWeather();
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
//如何解析完今天的天气,是否还需要解析未来几天的天气
if (forecastTag) { //解析未来几天的天气
if (localName.equals("forecast_conditions")) {
gfc = new GForecastConditions();
}
if (localName.equals("condition")) {
gfc.setCondition(attributes.getValue("data"));
} else if (localName.equals("day_of_week")) {
gfc.setDayOfWeek(attributes.getValue("data"));
} else if (localName.equals("low")) {
gfc.setLow("data");
} else if (localName.equals("high")) {
gfc.setHeight("data");
} else if (localName.equals("icon")) {
gfc.setIcon("data");
}
} else {//解析今天的天气
if (localName.equals("condition")) {
googleWeather.setCondition(attributes.getValue("data"));
String tmp="";
try {
tmp = new String(attributes.getValue("data").getBytes(),"gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Condition: "+ tmp);
} else if (localName.equals("temp_f")) {
googleWeather.setTempF(attributes.getValue("data"));
System.out.println("Temp_f: " + attributes.getValue("data"));
} else if (localName.equals("temp_c")) {
googleWeather.setTempC(attributes.getValue("data"));
} else if (localName.equals("humidity")) {
googleWeather.setHumdity(attributes.getValue("data"));
} else if (localName.equals("icon")) {
googleWeather.setWindCondition(attributes.getValue("data"));
} else if (localName.equals("wind_condition")) {
}
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// 当遇到</current_conditions>标签时,说明当前天气情况解析完毕,下一步将
// 解析未来几天的天气,所以将forecastTag设置为true
if (localName.equals("current_conditions")) {
forecastTag = true;
}
// 遇到</weather>里,设置forecastTag为false
if (localName.equals("weather")) {
forecastTag = false;
}
// 当遇到</forecast_conditions>时,说明未来一天的天气情况解析完毕,
// 我们将它增加到list中,接着往下解析
if (localName.equals("forecast_conditions")) {
forecastConditions.add(gfc);
}
}
public GoogleWeather getGoogleWeather() {
return googleWeather;
}
public void setGoogleWeather(GoogleWeather googleWeather) {
this.googleWeather = googleWeather;
}
}
在Android开发中,XML(可扩展标记语言)是一种常见的数据交换格式,用于存储和传输结构化数据。SAX(Simple API for XML)是处理XML的一种事件驱动模型,它以流式方式读取XML文档,适合处理大型XML文件,因为它不需要一次性加载整个文件到内存。本文将深入探讨Android中的SAX解析源码,帮助初学者理解其工作原理和应用。 SAX解析器在Android中的实现主要依赖于`org.xml.sax`包,它提供了一系列接口和类,如`XMLReader`、`ContentHandler`、`EntityResolver`等。`XMLReader`是SAX解析的核心,负责读取XML文档并调用用户定义的事件处理器。`ContentHandler`接口包含处理XML元素、属性、文本等事件的方法,是开发者自定义逻辑的主要入口。 在Android中使用SAX解析XML时,首先要创建一个实现了`ContentHandler`接口的类,然后在`startElement`、`endElement`和`characters`等方法中编写处理逻辑。例如,当遇到某个元素开始时,`startElement`会被调用,可以在此处记录或初始化状态;元素结束时,`endElement`调用,可以进行必要的清理或计算。 以下是一个简单的SAX解析示例: ```java import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; public class MyContentHandler implements ContentHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 处理元素开始 } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // 处理元素结束 } @Override public void characters(char[] ch, int start, int length) throws SAXException { // 处理元素内容 } // 其他ContentHandler接口方法... } ``` 接下来,需要创建一个`XMLReader`实例,并设置自定义的`ContentHandler`。通常,我们使用`XMLReaderFactory`的`createXMLReader`方法来获取`XMLReader`对象: ```java import javax.xml.parsers.XMLReader; import org.xml.sax.XMLReaderFactory; XMLReader xmlReader = XMLReaderFactory.createXMLReader(); xmlReader.setContentHandler(new MyContentHandler()); ``` 通过`XMLReader`的`parse`方法,指定XML输入源(如文件、URL或输入流),开始解析: ```java InputSource inputSource = new InputSource(new FileInputStream("path_to_xml_file")); xmlReader.parse(inputSource); ``` 在上述过程中,`GoogleWeateher`可能是XML文件的名字,可能包含了天气预报的相关数据。使用SAX解析这个文件,可以逐行读取和处理数据,避免了大文件内存占用过多的问题。 Android中的SAX解析提供了一种高效且灵活的方式来处理XML文档,开发者可以根据需要定制事件处理器,实现对XML数据的解析和处理。对于初学者来说,理解SAX解析的工作流程和如何自定义`ContentHandler`是关键,这将有助于开发更高效的Android应用。通过不断实践和学习,你将能熟练掌握这一强大的XML解析技术。






































































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- 豆腐都有人叫2012-05-31挺复杂的,看的不太懂,但编译运行没问题
- 九佾2013-06-16很有用的哦
- wan0bo2013-06-04sax解析就是复杂一些!
- 在那遥远的星空2012-11-23挺复杂的,看的不太懂,但编译运行没问题

- 粉丝: 41
- 资源: 28
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 21考试真题最近的t246.txt
- StarLogo开发教育3D游戏研究
- 21考试真题最近的t245.txt
- 21考试真题最近的t238.txt
- 21考试真题最近的t237.txt
- 21考试真题最近的t236.txt
- 21考试真题最近的t235.txt
- 21考试真题最近的t234.txt
- 21考试真题最近的t233.txt
- 21考试真题最近的t232.txt
- 21考试真题最近的t231.txt
- 21考试真题最近的t230.txt
- 基于主从博弈的电热综合能源系统动态定价策略与能量管理优化模型,基于主从博弈的电热综合能源系统动态定价策略与能量管理优化模型,MATLAB代码:基于主从博弈的电热综合能源系统动态定价与能量管理 关键词:
- 21考试真题最近的t229.txt
- 21考试真题最近的t228.txt
- 21考试真题最近的t227.txt


