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. 说说RMAN里的obsolete

    RMAN> report obsolete; RMAN retention policy will be applied to the commandRMAN retention policy ...

  2. Java面试——基础

    1,作用域,Java只有public,protect,private,默认是default相当于friendly 作用域 当前类          同一package 子类            其它 ...

  3. Hive学习之一 《Hive的介绍和安装》

    一.什么是Hive Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据 ...

  4. 为什么struts2 ajax 方法执行两次

    struts2中使用json插件执行ajax处理时,如果方法名是get方法的时候,方法会莫名其妙的执行两次. 原因: struts2 中JSON的原理是在ACTION中的get方法都会序列化,所以前面 ...

  5. vim插件和配置

    vim插件和配置 插件 pathogen 可以方便地管理vim插件 在没有pathogen的情况下,vim插件的文件全部都放在.vim目录,卸载插件很麻烦,pathogen可以将不同的插件放在一个单独 ...

  6. OpenGL画图旋转

    #include<gl/glut.h>#include<gl/GL.h>#include<gl/GLU.h>#include<math.h>#inclu ...

  7. History Grading

    uva111:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24& ...

  8. h.264全搜索以及快速全搜索算法

    Full Search 全搜索算法是最简单暴力的一种搜索算法,对搜索范围内的所有像素点都进行匹配对比,选出最合适的运动向量,以下就是一个搜索范围为4的全搜索范围(单个像素点) /*! ******** ...

  9. 足球3v3心得

    最近常踢球,由于不容易凑人,所以都是最小场:3v3.一开始是凭发育踢,谁的体力好.技术好.速度快.身体壮谁占优.渐渐觉得这样没有意思,就花点时间研究了下足球技战术,总结出几个简单的规律,后来发现这些好 ...

  10. COJ 0503 比赛

    比赛 难度级别:D: 运行时间限制:2000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 初三年级举办了一场篮球赛,共有N个班级参加.当WZJ知道了这件事情, 已经 ...