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. (转载)小课堂UI-Star Diamond Tutorial

  2. centos账户的uid和gid

    修改/etc/passwd和/etc/group文件的UID和GID为0,可以获得root权限,不过不推荐~ UID和GID Linux系统如何区别不同的用户呢?可以很自然地想到,使用不同的用户名应该 ...

  3. Bug: freetype/fterrors.h: No such file or directory

    Bug描述: 安装PIL过程中出现题目中的错误信息,具体如下:

  4. The underlying provider failed on Open. EF

    本地测试是可以的:但是放到服务器上就不行了: 报错:"The underlying provider failed on Open." 这一情况和我以前遇上的一次错误有点相似啊:都 ...

  5. jQuery全选、反选、全不选

    原文链接:https://yq.aliyun.com/articles/33443 HTML内容部分: <ul id="items"> <li> <l ...

  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />

    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalabl ...

  7. C语言:Message类

    message.h #ifndef MESSAGE_H #define MESSAGE_H #define TRUE 1 #define FALSE 0 typedef struct { int se ...

  8. android 休眠唤醒机制分析(二) — early_suspend

    本文转自:http://blog.csdn.net/g_salamander/article/details/7982170 early_suspend是Android休眠流程的第一阶段即浅度休眠,不 ...

  9. 网站优化指南之数据库缓存、CDN与云存储

    1 数据库缓存. 常见的做法是用内存做cache,把数据库里的内容提前取出读到内存里,用户再请求时,就不直接读数据库,而是读内存里的数据,从而缓解了数据库的压力. 过去比较常用的缓存软件是memcac ...

  10. hdu 1051Wooden Sticks

    #include<cstdio> #include<cstring> #include<algorithm> #define maxn 10000 using na ...