:Android网络编程--XML之解析方式:SAX
任何放置在资源(res)目录下的内容可以通过应用程序的R类访问,这是被Android编译过的,而任何放置在资产(assets)目录下的内容会保持它的原始文件格式,为了读取它们,必须使用AssetManager来以字节流的方式读取文件,所以文件和数据保存在资源中更方便访问。
2. 凡是在R文件中定义的资源都可以通过 “@Static_inner_classes_name/resourse_name”的方式获取如:“@id/button”, @string/app_name。表达式:“@+id/button”,意思是在不久文件中为一些组件添加id属性。+表表示在R.java的名为id的内部类中添加一条记录。
XML:是Internet环境中跨平台的依赖于内容的技术,是当前处理结构化文档信息的有力工具。使用一系列简单的标记描述数据。(76)
SAX: 是一种以事件为驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序代码的XML结构,简单的讲,它是个解析速度快,占用内存少的解析器,这种技术特别适用于Android等移动设备。
备注:以事件为驱动
简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于HandleMsg的一个名字)。对于框架的使用者来说,他们唯一能够看到的是事件处理器。这也是他们所关心的内容。
DEMO:使用SAX解析XML文档:
1.创建一个Person类,存放相关的信息:
package com.example.model;
public class Person {
private Integer id;
private String name;
private Short age;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(Integer id, String name, Short age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "id=" +id +",name="+name+",age=" + age;
}
}
2.创建一个SAXForHandler类,继承自DefaultHandler,DefaultHandler实现了ContentHandler,ContentHandler提供了相应的方法。
package com.example;
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.util.Log;
import com.example.model.Person;
public class SAXForHandler extends DefaultHandler {
private static final String TAG = "SAXForHandler";
private List<Person> persons;
private String perTag; // record the name of previous tag
Person person;// current person
public List<Person> getPersons() {
return persons;
}
/**
* 在开始解析文档时执行一次
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
persons = new ArrayList<Person>();
Log.i(TAG, "****startDocument()****");
}
@Override
public void endDocument() throws SAXException {
Log.i(TAG, "****endDocument()****");
}
/**
* uri:命名空间
* localName:标签名称
* qName:带 命名空间的标签名
* attributes:存放该标签的所有属性
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("person".equals(localName)) {
for (int i = 0; i < attributes.getLength(); i++) {
Log.i(TAG, "attributeName:" + attributes.getLocalName(i) + ",attribute_value" +attributes.getValue(i) );
person = new Person();
person.setId(Integer.valueOf(attributes.getValue(i)));
}
}
perTag = localName;
Log.i(TAG, qName + "****startElement()****" );
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG, "qName" + "***endElement()***");
if("person".equals(localName)){
persons.add(person);
person =null;
}
perTag = null;
}
/**
* ch:当前读取到的TextNode节点
* start:字节开始的位置,如果要读取全部,那就是从0开始
* length:当前TextNode的长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String data = new String(ch,start,length).trim();
if(!"".equals(data)){
Log.i(TAG, "content" + data);
}
if("name".equals(perTag)){
person.setName(data);
}else if("age".equals(perTag)){
person.setAge(new Short(data));
}
}
}
3.创建一个person.xml文件放在src下:
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="1">
<name>wyy</name>
<age>27</age>
</person>
<person id="2">
<name>cL</name>
<age>26</age>
</person>
</persons>
4.测试的activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
List<Person> ps = sax_XML();
for (int i = 0; i <ps.size(); i++) {
Person p = ps.get(i);
Log.i("AA", p.getName() +"id="+p.getId()+",age="+p.getId() );
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public List<Person> sax_XML() throws Exception{
//通过类加载器获取路径,再以输入流的方式放入解析器。
InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("wangyuanyuan.xml");
SAXForHandler handler = new SAXForHandler();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
//使用SAXParser
// saxParser.parse(is, handler);
//使用xmlReader
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(is));
List<Person> list = handler.getPersons();
is.close();
return list;
}
}
两种方法使用SAXParser 和xmlReader都可以解析成功。
除了使用SAX我们还可以使用DOM、PULL等解析XML文档。其中PULL解析器被集成在了android系统中 。PULL解析器不仅仅可以解析XML还可以修改或者生成新的XML文件
不过最近在我们的项目中一般都是用json解析,更加简洁方便。
参考:百度百科、《Android 4.0 网络编程》
:Android网络编程--XML之解析方式:SAX的更多相关文章
- Android:XML简介 & 解析方式对比(DOM、SAX、PULL)
目录 示意图 1. 定义 XML,即 extensible Markup Language ,是一种数据标记语言 & 传输格式 2. 作用 对数据进行标记(结构化数据).存储 & ...
- XML的解析方式(DOM、SAX、StAX)
(新) XML的解析方式(DOM.SAX.StAX) 博客分类: XML 一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...
- Android网络编程(三)Volley使用方法全解析
相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection 前言 Volley想必许多人都用过,为了建立网络编程的知识 ...
- Android网络编程概述
Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...
- Android 网络编程 记录
简单介绍 看了深入理解Android网络编程感觉不错.今天对Android网络编程进行了要点记录. 内容 Android基于网络技术和编程实践 要点 定义 描写叙述 IP协议 用于报文交换网络的一种面 ...
- Android网络编程要学的东西与Http协议学习
本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...
- Android网络编程(一)HTTP协议原理
相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley使用方法全解析 A ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
随机推荐
- 与班尼特·胡迪一起攻破浮空城 (HZNU-2264)
与班尼特·胡迪一起攻破浮空城 AC Time Limit: 1 s Memory Limit: 256 MB Description 桐人为了拯救被困在浮空城堡最顶层的亚丝娜,决定从第 ...
- 学习了解CyclicBarrier
CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行.下面是一个学习过程中采用的示例, ...
- 为什么在JDBC要使用Class.forName();这句话
为什么在调用JDBC的时候,我们总要写这句话:Class.forName("驱动类");解释:在JDBC编程中一般有以下几个步骤:1>加载驱动,也就是Class.forNam ...
- 高性能网络通信框架 HP-Socket
HP-Socket 详细介绍 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/ ...
- 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!
今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...
- Tornado day1
Tornado 之路由配置 首先导入模块,使用Application方法中可配置多个路由,格式必须为列表中是元组 元组的第一个是配置的url,第二个参数时自定义的类(继承自RequestHandler ...
- Python_字符串之删除空白字符或某字符或字符串
''' strip().rstrip().lstrip()分别用来删除两端.右端.左端.连续的空白字符或字符集 ''' s='abc ' s2=s.strip() #删除空白字符 print(s2) ...
- PAT1081:Rational Sum
1081. Rational Sum (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N ...
- jQuery 素材 缩略图轮播集合
http://www.17sucai.com/pins/demo-show?id=27124 http://www.17sucai.com/pins/demo-show?id=4712 楼盘详情缩略 ...
- TSL1401线性CCD TM32F103开发平台移植源代码
Technorati Tags: stm32 模块资料 对于线性CCD而言,开发着更多的是基于飞思卡尔系列单片机进行开发,前几天在做项目的时候需要用到该传感器,故使用了蓝宙CCD的驱动历程,然后对蓝宙 ...