SAX PULL解析实例
XML三种解析方式:
SAX解析:基于事件驱动,事件机制基于回调函数的,得到节点和节点之间内容时也会回调事件
PULL解析:相同基于事件驱动,仅仅只是回调时是常量
DOM解析:是先把XML文件装入内存中。在解析,耗费资源
SAX解析:
student.xml
<? xml version="1.0" encoding="UTF-8"? > -<students> -<student group="1" id="1001"> <name>张三</name> <sex>男</sex> <age>30</age> <email>zhangsan@163.com</email> <birthday>1900-09-09</birthday> <memo>组长</memo> </student> -<student group="1" id="1002"> <name>lisi</name> <sex>女</sex> <age>23</age> <email>lisi@163.com</email> <birthday>2000-09-09</birthday> <memo>组员</memo> </student> -<student group="1" id="1003"> <name>wangwu</name> <sex>男</sex> <age>30</age> <email>wangwu@163.com</email> <birthday>1990-09-09</birthday> <memo>组员</memo> </student> -<student group="2" id="1004"> <name>Jack</name> <sex>男</sex> <age>30</age> <email>jack@163.com</email> <birthday>2001-09-09</birthday> <memo>组长</memo> </student> -<student group="2" id="1005"> <name>Rose</name> <sex>女</sex> <age>23</age> <email>rose@163.com</email> <birthday>2003-09-09</birthday> <memo>组员</memo> </student> -<student group="3" id="1006"> <name>Tom</name> <sex>男</sex> <age>30</age> <email>tom@163.com</email> <birthday>2008-09-09</birthday> <memo>组长</memo> </student> </students>
StudentHandler.java
public class StudentHandler extends DefaultHandler {
// 声明成员变量
private List<Student> studentList; //存放多个学生
private Student student; //存放一个 学生
private String currentTag; //当前标签名字
// 给外部提供List集合的訪问方式
public List<Student> getList() {
return studentList;
} // 重写5个回调方法
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("文档解析開始"); }
/**
* String uri:元素的命名空间
* String localName:元素的本地名称
* String qName:标签的名称 book id name
* Attributes attributes: 属性的集合表示
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//currentTag赋值
currentTag=qName;
//推断标签
if("students".equals(qName))
{
studentList=new ArrayList<Student>();
}
if("student".equals(qName))
{
student=new Student();
//推断属性
if(attributes.getLength()>0)
{
//获取属性的值
for (int i = 0; i < attributes.getLength(); i++) {
//获取key
String lname=attributes.getLocalName(i);
//通过推断获取值
if("id".equals(lname))
{
student.setId(Integer.parseInt(attributes.getValue(i))); //获取值
}else if("group".equals(lname))
{
student.setGroup(Integer.parseInt(attributes.getValue(i)));
}
}
}
} } /**
* char[] ch, 将開始与结尾标签之间的值转成char数组的形式
* int start, 数组開始位置
* int length 读取数据的长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String str=new String(ch,start,length);
if("name".equals(currentTag))
{
student.setName(str);
}else if("sex".equals(currentTag))
{
student.setSex(str);
}else if("age".equals(currentTag))
{
student.setAge(Integer.parseInt(str));
}else if("email".equals(currentTag))
{
student.setEmail(str);
}else if("birthday".equals(currentTag))
{
student.setBirthday(str);
}else if("memo".equals(currentTag))
{
student.setMemo(str);
}
//清空currentTag
currentTag="";
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if("student".equals(qName))
{
studentList.add(student);
student=null;
}
} @Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("文档解析结束");
}
}
StudentTest.java
public class StudentTest { /*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 1.创建解析工厂类
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.通过工厂对象创建一个解析器对象
SAXParser parser = factory.newSAXParser();
// 3.创建DefaultHandler的子类对象
StudentHandler handler = new StudentHandler();
parser.parse(new File("C:/1505/day30/xml/student.xml"), handler);
// 4.获取集合的结果
List<Student> list = handler.getList();
// 5.打印
for (Student student : list) {
System.out.println(student);
} } }
打印结果:
PULL解析:
pull解析的第三方的,须要导入jar包才干支持
本次依旧解析上面的student.xml文件
public class PullTest {
public static void main(String[] args) throws Exception {
// 1.创建解析工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2.通过解析工厂创建解析器的实例
XmlPullParser parser = factory.newPullParser();
// 3.给解析器设置要解析的数据
parser.setInput(new FileReader("C:/a/student.xml"));
// 4.创建集合对象 用于存储解析完毕之后的存放
List<Map<String, Object>> list = null;
Map<String,Object> map = null;
// 5.获取事件类型
int eventType = parser.getEventType();
// 推断事件类型 不清楚循环次数使用while
while (eventType != XmlPullParser.END_DOCUMENT) {// 不是结尾就開始循环
// 获取当前标签名称
String cuTagString = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Map<String,Object>>();
break; case XmlPullParser.START_TAG:
if("student".equals(cuTagString)){
map = new HashMap<String, Object>();
//获取标签的属性值
for(int i=0;i<parser.getAttributeCount();i++){
//获取第i个属性名
String name = parser.getAttributeName(i);
if("group".equals(name)){
map.put("group", parser.getAttributeValue(i));
}else if("id".equals(name)){
map.put("id", parser.getAttributeValue(i));
}
}
}else if("name".equals(cuTagString)){
map.put("name", parser.nextText());
}else if("sex".equals(cuTagString)){
map.put("sex", parser.nextText());
//..........这里不解析了
}
break;
case XmlPullParser.END_TAG:
if("student".equals(cuTagString)){
list.add(map);
} cuTagString="";
break;
default:
break;
}
//获取下一个事件类型,此处忘记将会是一个死循环
eventType=parser.next();
}
for (Map<String, Object> map2 : list) {
System.out.println(map2);
} }
}
打印结果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
常常出现PULL本地解析抛出:Exception in thread "main" org.xmlpull.v1.XmlPullParserException: PI must not start with xml (position:unknown 锘?
@1:6 in java.io.FileReader@5e2de80c) 这里设置相应编码就能够。
以上两种都是本地解析,网络解析同理,仅仅要将解析的数据源设置相相应的网络流就能够。
SAX PULL解析实例的更多相关文章
- Android 通过Dom, Sax, Pull解析网络xml数据
这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...
- Android系列--DOM、SAX、Pull解析XML
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- pull解析和sax解析的差别
假设在一个XML文档中我们仅仅须要前面一部分数据.可是使用SAX方式或DOM方式会对整个文档进行解析,虽然XML文档中后面的大部分数据我们事实上都不须要解析.因此这样实际上就浪费了处理资源. 使用PU ...
- Java sax、dom、pull解析xml
-------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度 ...
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...
- 非常简单的XML解析(SAX解析、pull解析)
这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
- Android SAX、DOM、Pull解析xml文件剖析与案例讲解
XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...
- 解析XML:DOM,SAX,PULL
Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...
随机推荐
- Mac OS X 10.9 Mavericks 修改root密码
Mac10.9忘记密码后有两种方式可以进去: 代码如下 复制代码 1.sudo passwd 重新输入密码即可,此方法修改了root的密码 代码如下 复制代码 2.sudo bash 输入当前用户 ...
- 巧妙的Jq仿QQ游戏导航界面学习
先贴上源代码 <!doctype html> <html> <head> <meta charset="utf-8"> <ti ...
- UIWebView(本地数据部分)
创建UIWebView和UISegmentedControl webView用于显示内容,segmentedControl用于切换读取内容的类型 为了方便起见 用拖拉控件形式布局完界面 /* 使用UI ...
- JAVA-4-斐波列
public class Ch049 { public static void main(String[] args) { // TODO 自动生成的方法存根 int a = 1, b = 1; fo ...
- 安卓之cannot convert from Fragment1 to Fragment
在写一个音乐播放器的时候,用到了fragment,结果在需要返回Fragment的方法里面,无法将Fragment1(Fragment的子类)强制转换成Fragment, 很是纳闷,我是参照一个开源代 ...
- jQuery截取字符串插件区分中英文
jQuery截取字符串插件区分中英文:截取字符串功能在大量网站都有应用,比如新闻列表这样的功能,因为新闻的标题长途未必都是恰如其分的,所以要根据需要截取指定长度的字符串,下面就分享一个jQuery实现 ...
- Jquery的外部链接和编写样式
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></ ...
- DeDe调用body文章内容
{dede:sql sql='select * from dede_addonarticle where aid=3'} <div class="pageArea hide" ...
- phalcon安装和输出 hello word
1:下载和安装Wampserver2.4-x86.exe 服务器: 2:到phalcon官方网站下载对应的dll文件 phalcon_x86_VC9_php5.4.0_1.2.5 我下的是这个版本 所 ...
- Asp.net mvc中Controller的返回值
(1)EmptyResult:当用户有误操作或者是图片防盗链的时候,这个EmptyResult就可以派上用场,返回它可以让用户啥也看不到内容,通过访问浏览器端的源代码,发现是一个空内容: public ...