Android使用SAX解析xml
一、理论准备
SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始、元素开始、文本、元素结束、文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事件,以此来获取XML文档里的信息。
DOM标准简单易用,但是它需要一次性地读取整个XML文档,而且在程序运行期间,整个DOM树常驻内存,导致系统开销过大。SAX解析方式占用内存小,处理速度更快。
由于DOM一次性将整个XML文档全部读入内存,因此可以随机访问XML文档的每个元素。SAX采用顺序模式来依次读取XML文档,因此无法做到随机访问XML文档的任意元素。
二、项目结构
框住的是本实例需要的代码。
三、实例实现
<?xml version="1.0" encoding="UTF-8"?> Jack
24 Tom
25 Bob
22
ps:不知道为啥,用xml格式发布就出问题,用java就不出问题~~
package xml; import java.io.InputStream;
import java.util.List; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; public class SaxService {
public static List readXML(InputStream inputStream) throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance(); //创建SAXParserFactory对象(SAX解析器工厂)
SAXParser saxParser = spf.newSAXParser(); //创建SAXParser对象(SAX解析器)
MyDefaultHandle myDefaultHandle = new MyDefaultHandle(); //MyDefaultHandle对象,继承自DefaultHandle类
saxParser.parse(inputStream, myDefaultHandle); //解析XML文档(以InputStream对象的形式)
inputStream.close(); //关闭InputStream对象
return myDefaultHandle.getPersonList(); //返回XML文档中的数据列表
}
}
package xml; import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyDefaultHandle extends DefaultHandler {
private Person person = null; //存储解析得到的单个Person对象
private List personList = null; //存储解析得到的所有Person对象
private String currentTag = null; //正在解析的元素的标签 private static final String TAG = "MyDefaultHandle"; //Log标签 public List getPersonList() {
return personList;
} public void startDocument() throws SAXException {
personList = new ArrayList();
System.out.println("开始解析");
} public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("person")) { //当遇到标签时,创建一个Person对象
person = new Person();
if(attributes!=null) {
person.setId(Integer.parseInt(attributes.getValue(0)));//将读到的id属性值存入Person对象
}
System.out.println("处理标签");
} currentTag = qName; //设置当前读到的标签
} public void characters(char[] ch, int start, int length) throws SAXException {
String currentValues = new String(ch, start, length); //获取当前标签里的内容
if(currentTag != null) {
if(currentTag.equals("name")) { //将读到的name属性值存入Person对象
person.setName(currentValues);
}else if(currentTag.equals("age")) { //将读到的age属性值存入Person对象
person.setAge(Integer.parseInt(currentValues));
}
System.out.println("处理元素");
}
} public void endElement(String uri, String localName, String qName) throws SAXException {
//当读到标签时,向列表中添加读取到的单个Person对象
if(qName.equals("person") && (person != null)) {
personList.add(person);
person = null;
System.out.println("添加一个person");
}
currentTag = null;
} public void endDocument() throws SAXException {
System.out.println("完毕");
} }
package xml;
public class Person {
private String name;
private int age;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package xml;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
public class Test {
static String URL_PATH = "http://localhost:8080/TestGet/person.xml";
public static InputStream getInputStream() throws IOException {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;
try {
URL url = new URL(URL_PATH);
if (url != null) {
httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置连接网络的超时时间
httpURLConnection.setConnectTimeout(3000);
httpURLConnection.setDoInput(true);
// 设置本次http请求使用get方式请求
httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {
// 从服务器获得一个输入流
inputStream = httpURLConnection.getInputStream();
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return inputStream;
}
public static void main(String[] args) throws IOException, Exception {
// TODO Auto-generated method stub
if(getInputStream()==null) {
System.out.println("读取失败");
return ;
}
List<Person> person = SaxService.readXML(getInputStream());
System.out.println(person.size());
for(int i=0; i<person.size(); i++)
System.out.println("id:"+person.get(i).getId()+"age:"+person.get(i).getAge()
+"name:"+person.get(i).getName());
}
}
结果如下:
开始解析
处理元素
处理标签
处理元素
处理元素
处理元素
添加一个person
处理标签
处理元素
处理元素
处理元素
添加一个person
处理标签
处理元素
处理元素
处理元素
添加一个person
完毕
3
id:1age:24name:Jack
id:2age:25name:Tom
id:3age:22name:Bob
四、遗留问题
1.sax解析中Name和localName什么区别,想到这个是因为一哥们用的localName和person判断他表示结果对了,费解???
2.endElement的if里把person设置为null是为了防止重复触发该事件,之后把currentTag设置为null是何意?莫非存在如下情况,费解啊。。。

Android使用SAX解析xml的更多相关文章
- Android之SAX解析XML
一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...
- Android使用SAX解析XML(1)
可扩展标记语言XML是一种数据交换格式,允许用户自己定义,适合Web传输,能提供独立于程序的数据.XML在Android中也有广泛的应用,Android解析XML的方法有很多,本文介绍使用SAX(Si ...
- Android使用SAX解析XML(4)
util.java文件如下: package com.hzhi.my_sax; import java.io.IOException; import java.io.InputStream; impo ...
- Android使用SAX解析XML(5)
parse_handler.java文件: package com.hzhi.my_sax; import org.xml.sax.Attributes; import org.xml.sax.SAX ...
- Android使用SAX解析XML(3)
主界面MainActivity.java: package com.hzhi.my_sax; import java.util.ArrayList; import android.os.Bundle; ...
- Android使用SAX解析XML(2)
school类包含了一个major列表,可以增加该列表的元素,以及返回该列表,还实现了Parcelable.Creator接口. package com.hzhi.my_sax; import jav ...
- Android使用SAX解析XML(6)
应用截图: (1)开始运行时 (2)选择学院 (3)选择专业 (4)选择班级 (5)选择班级的详细信息 本文参考了<Android平台开发之旅>.
- Android 使用pull,sax解析xml
pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...
- Android SAX解析XML
本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍: SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度 ...
随机推荐
- Java为什么会超时
java程序,最终是转成c运行的,我们写的程序会转成c代码,并且由底层的c程序调用,可以理解成我们程序最后变成被调用的c函数 底层的C程序是java虚拟机,由它读取我们的.class文件,翻译成c ...
- CVPR 2013 录用论文【待更新】
完整录用论文官方链接:http://www.pamitc.org/cvpr13/program.php 过段时间CvPaper上面应该会有正文链接 今年有关RGB-D摄像机应用和研究的论文渐多起来了. ...
- jQuery DOM XSS漏洞
jQuery DOM XSS漏洞http://automationqa.com/forum.php?mod=viewthread&tid=2943&fromuid=21
- 查询制定行数的数据(2)对了,mysql不能用top关键字
采用嵌套查询的方式,倒序之后前10条 倒序之后前9条 采用嵌套查询的方式,倒序之后前10条 排正序之后从第一条开始弄十条数据 排正序之后从第一条开始弄九条数据 排正序之后从第十条开始弄十条数据 排正序 ...
- postgresql 行转列,列转行后加入到一个整体数据
这里行转列的基本思想就是使用max,因为其他列下面都是NULL,所以可以Max最后就只能得到有值的这行 普通的查询: SELECT icd , case when (ROW_NUMBER() OVER ...
- 首页TAB页的技术选择与功能实现
一般的选择是用viewpager,这个有开源库.不过因为要引入开源库,所以有时候显得比较大. 下面这段代码是用在一个BaseActivity上面的,下面继承的Activity直接使用该方法,就可以完成 ...
- pull解析xml文件
pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...
- Nagios-配置版
1 概念(简介) Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的.Nagios监控的对象可分为两类:主机和服务.主机通常指的是物理主 ...
- mysql数据库文件默认保存目录(windows)
如果没有自己去设置安装路径,MYSQL默认安装在C:/Program Files/MySQL/MySQL Server 5.1,新建的数据库文件在C:/Documents and Settings/A ...
- iOS iOS与html进行交互
实现的 效果就是上边那样:首先通过webview 进行网络请求 然后进行显示. 然后点击下一页的按钮 通过js的响应显示另一个网页 最后通过下一页的按钮可以返回到首页. 本文仅仅是h5跟ios 的交互 ...