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文件的所有内容 ...
随机推荐
- linux下系统定时任务配置----crontab(mysql定时备份)
crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任 ...
- iOS在Cocoa Touch Static Library使用CocoaPods
1.在XCode中新建静态库工程:DDLogLib. 2.添加对外暴露接口的头文件DDLogLibHeader.h 3.命令行进入DDLogLib目录,运行pod init,并修改Podfile 4. ...
- 实用iPhone Cydia插件
BadgeClear(角标清除):可以清除App推送所在图标右上角出现的红色角标.在桌面长按图标后,图标开始左右摇动,再双击图标即可清除点击的图标角标. Bitesms(短信):收费插件,具有 ...
- 浅析a标签的4个伪类 .
关于伪类,大家最熟悉的还是a标签的4个伪类::link 有链接属性时:visited 链接地址已被访问过:active 被用户激活(在鼠标点击与释放之间发生的事件):hov ...
- 关于$_SERVER 常量 HTTP_X_FORWARDED_HOST与 HTTP_HOST的问题
今天在看ecshop的源码,发现了用$_SERVER['HTTP_X_FORWARDED_HOST']来判断主机的地址,就目前来说很多人都是直接通过$_SERVER['HTTP_HOST']来判断的, ...
- Python爬虫预备知识
1.http编程知识 http中client 和server的工作模式 client和server建立可靠的tcp链接(在HTTP1.1中这个链接是长时间的,超时断开策略) client通过socke ...
- 周赛C题 LightOJ 1047 (DP)
C - C Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description Th ...
- SCJP_104——题目分析(2)
3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out ...
- split和join和pop和remove用法
简单字符串分割不需要import re,多字符串分割要导入re,多个字符串分割的分隔符要用 | 分开 >>> msg='chen hang wuhan keji daxue aljl ...
- bzoj3576: [Hnoi2014]江南乐
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一 ...