Android XML的操作(SAX)

简介:   在android平台下操作xml方式有很多种,常见的为SAX(Simple APIfor XML)和DOM(Document Object Model)。  SAX操作xml的特点是当读取xml文件的时候会随时触发事件,通过事件来处理当前读取到的内容。

  在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();
}
}

  这个类保存的是获取到的数据,形式可能有多种,这个根据个人的习惯进行书写吧。写到这里,因为在SAX中使用的时候需要有一个DefaultHandler类的继承,实现如下:

 
 
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 {
}
}

  在这里实现了读取XML代码,并且保存到抽象出来的类中,以供调用。下面的方法是对这个类的调用,通过调用,获取内容:

 
 
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();

  这里直接通过获取网上的XML进行的解析,当然你也可以读取本地的XML文件进行解析,这个是一样的。因为有事情,这个写的包括一些方法的命名可能不是怎么规则,还请多多谅解。

  如果代码中有什么错误,欢迎指正!

目录
相关文章
|
3月前
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
164 1
|
5月前
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
47 1
|
6月前
|
XML API PHP
Android使用XML-RPC实现blog客户端
Android使用XML-RPC实现blog客户端
57 2
|
3月前
|
存储 Java 数据库
基于全志H713 Android 11:给TvSettings添加default.xml默认值
本文介绍了在全志H713 Android 11平台上为TvSettings应用添加HDMI CEC功能的默认设置值的方法,通过修改SettingsProvider的源码和配置文件来实现默认值的设置,并提供了详细的步骤和测试结果。
78 0
基于全志H713 Android 11:给TvSettings添加default.xml默认值
|
3月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
113 12
|
3月前
|
Shell Android开发
安卓scheme_url调端:在AndroidManifest.xml 中如何配置 Intent-filter?
为了使Android应用响应vivo和oppo浏览器的Deep Link或自定义scheme调用,需在`AndroidManifest.xml`中配置`intent-filter`。定义启动的Activity及其支持的scheme和host,并确保Activity可由外部应用启动。示例展示了如何配置HTTP/HTTPS及自定义scheme,以及如何通过浏览器和adb命令进行测试,确保配置正确无误。
|
5月前
|
Android开发 开发者
Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。
【6月更文挑战第26天】Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。要更改主题,首先在该文件中创建新主题,如`MyAppTheme`,覆盖所需属性。然后,在`AndroidManifest.xml`中应用主题至应用或特定Activity。运行时切换主题可通过重新设置并重启Activity实现,或使用`setTheme`和`recreate()`方法。这允许开发者定制界面并与品牌指南匹配,或提供多主题选项。
84 6
|
5月前
|
XML API 开发工具
Android Bitmap 加载与像素操作
Android Bitmap 加载与像素操作
48 2
|
4月前
|
Android开发
Android kernel 操作gpio
Android kernel 操作gpio
43 0
|
5月前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
66 1