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解析实例的更多相关文章

  1. Android 通过Dom, Sax, Pull解析网络xml数据

    这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...

  2. Android系列--DOM、SAX、Pull解析XML

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  3. pull解析和sax解析的差别

    假设在一个XML文档中我们仅仅须要前面一部分数据.可是使用SAX方式或DOM方式会对整个文档进行解析,虽然XML文档中后面的大部分数据我们事实上都不须要解析.因此这样实际上就浪费了处理资源. 使用PU ...

  4. Java sax、dom、pull解析xml

    -------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度 ...

  5. Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件

    一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...

  6. 非常简单的XML解析(SAX解析、pull解析)

    这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...

  7. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  8. Android SAX、DOM、Pull解析xml文件剖析与案例讲解

    XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...

  9. 解析XML:DOM,SAX,PULL

    Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...

随机推荐

  1. [转] iOS TableViewCell 动态调整高度

    原文: http://blog.csdn.net/crayondeng/article/details/8899577 最近遇到了一个cell高度变化的问题,在找解决办法的时候,参考了这篇文章,觉得不 ...

  2. 了解HTML的代码注释

    什么是代码注释?代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你所编写的代码,就能很快想起这段代码的用途. 代码注释不仅方便程序员自己回忆起以前代码的用途,还可以帮助其他程序员很快的读懂你 ...

  3. angular.js学习手册(二)

    如何使用angularjs? 各个 angular.js 版本下载: https://github.com/angular/angular.js/releases 下载完之后,在你需要使用angula ...

  4. 《JavaScript高级程序设计》读书笔记

    Javascript由以下三部分组成: 核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM) ECMAScript组成部分: 语法.类型.语句.关键字.保留子.操作符.对象. ...

  5. 简单的js反选,全选,全不选

    <html> <head> <base href="<%=basePath%>"> <title>My JSP 'che ...

  6. Js 旋转平滑特效

    效果图 源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  7. The ultimate jQuery Plugin List(终极jQuery插件列表)

    下面的文章可能出自一位奥地利的作者,  列出很多jQuery的插件.类似的网站:http://jquerylist.com/原文地址: http://www.kollermedia.at/archiv ...

  8. js 得到当前季度

    Date.prototype.getQuarter = function() { var month = this.getMonth(); if(month < 3) { return '第一季 ...

  9. 很久之前写的Ajax库

    很久之前写的一个小型AJAX的js,放在上面以免以后想玩了找不到了. // version : 0.1 beta // author : __Ajax function __Ajax(url,opti ...

  10. python logging模块使用

    近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import loggi ...