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. c - 字符串的反转

    1,递归实现 // 递归实现字符串反转(可通过栈的调用来加深理解). char * reverse(char *c) { if(!c) return NULL; int len = strlen(c) ...

  2. TCP/IP-IP

    A contented mind is a perpetual feast. "知足长乐" 参考资料:TCP/IP入门经典 (第五版) TCP/IP详解 卷一:协议 一.简介 IP ...

  3. Android学习----Activity

    一.什么是activity Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能.它是 android 应用程序的基本功能单元.Activity 本身是没有界面的.所以activ ...

  4. php错误级别设置

    在php.ini中可以设置服务器对错误的报警级别.在默认情况下,php将报告除了通知之外的所有错误. 错误报告级别是通过一些预定义的常量来设置的, 语法 int error_reporting ( [ ...

  5. 如何把powerpoint幻灯片大小改为标准或宽屏教程【图文】

    不知道大家还记得早期powerpoint版本,幻灯片的形状是较方(4:3),随着科技的发展,很多电视.视频都在用宽屏,powerpoint自然也是如此,现在默认的幻灯片大小是宽屏 (16:9),怎么把 ...

  6. ORACLE数据库操作基本语句

    1.登陆SPL*PLUS [username/password] [@server] as [sysdba|sysoper] eg. system/password or connect sys/pa ...

  7. 省队集训day6 C

    Description 给定平面上的 N 个点, 其中有一些是红的, 其他是蓝的.现在让你找两条平行的直线, 使得在保证    不存在一个蓝色的点 被夹在两条平行线之间,不经过任何一个点, 不管是蓝色 ...

  8. 直接引用windows命名空间

    再逛博客的时候,看见一段这样代码.获取系统密码的 static void DumpCredentials(Windows.Security.Credentials.PasswordCredential ...

  9. 转一篇:Hyper-V和VMware的高可用实时迁移技术详解

    ESX里以集群的ha.drs.dpm功能实现 HYPER-V里以集群+共享存储实现. ~~~~~~~~~~ 微软公司的Hyper-V虚拟化管理程序一经面世就引发了业界的普遍关注.本文意在对Hyper- ...

  10. 配置Session变量的生命周期

    在Web.config文件中配置Session变量的生命周期是在<sessionState></sessionState>节中完成的,在配置Session的生命周期时,可以设置 ...