一、Sax解析

是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档。

Sax采用事件驱动的方式解析文档。简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取)

在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或处理这些信息

同样,在Sax的解析过程中,读取到文档开头、结尾,元素的开头和结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理

这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement

此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容

将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的解析器

一般从Main方法中读取文档,却在解析器中处理文档,这就是所谓的事件驱动解析方法(解释为转载)

------------------------------------------------------------------------------------------------------------------------------------------------------

解析器中的方法:

1.解析文档开头

 @Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}

2.解析开始标签

 @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
}

3.解析内容

 @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
}

4.解析结束标签

 @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
}

5.解析文档结束

 @Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}

下面看一个Demo来实现解析一个xml文件

(1).xml文件

 <?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>张三</name>
<age></age>
<sex>男</sex>
</person> <person>
<name>李四</name>
<age></age>
<sex>女</sex>
</person> <person>
<name>王五</name>
<age></age>
<sex>男</sex>
</person>
</persons>

user.xml

(2)解析器

 package saxparser;

 import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class Myhandle extends DefaultHandler{
//一个列表集合用来存放对象
List<Student> list = null;
Student stu = null;
//存放标签名称
String str = null;
//文件开始
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("文件解析开始");
//准备工作,创建列表集合对象
list = new ArrayList<Student>();
}
//标签开始
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
str=qName;
//标签到这里说明有<person>数据了,需要创建一个Student对象存放解析出来的数据
if("person".equals(str))
{
stu = new Student();
// if(attributes!=null) 如果标签<person>里有属性的话
// {
// for(int i=0;i<attributes.getLength();i++)
// {
// //得到属性名
// String attrName = attributes.getQName(i);
// //得到属性值
// String attrValue = attributes.getValue(i);
//
// if("id".equals(attrName))
// {
// stu.setId(attrValue);
// }
// }
// }
}
}
//内容解析
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
//获得解析的标签内容
String s = new String(ch,start,length);
if("name".equals(str))
{
stu.setName(s);
}
else if("age".equals(str))
{
stu.setAge(Integer.parseInt(s));
}
else if("id".equals(str))
{
stu.setAge(Integer.parseInt(s));
}
}
//结束标签解析
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
//注意这里,存放标签名字的str字符串必须要置空,=null or =""
str=null;
if("person".equals(qName))
{
list.add(stu);
}
}
//结束文件解析
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文件解析结束");
} public List<Student> list(){
return list;//返回列表集合
}
} Myhandle.java 解析器

Myhandle.java解析器

(3)测试类

 package saxparser;

 import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class Text {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析的工厂类对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建解析器对象
SAXParser parser = factory.newSAXParser(); File f= new File("user.xml");
//解析器去读取xml文件并去调用handle里边的函数
Myhandle handle = new Myhandle();
parser.parse(f, handle);
//获得存放Student对象的集合
List<Student> list = handle.list;
//遍历集合
for(int i=;i<list.size();i++)
{
System.out.println(list.get(i));
} }
}

(4).对象类

 package saxparser;

 public class Student {
private int id;
private String name ;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
} }

Student

(5)控制台输出信息

 文件解析开始
文件解析结束
Student [id=, name=张三, age=]
Student [id=, name=李四, age=]
Student [id=, name=王五, age=]

控制台输出效果

Java数据解析---SAX的更多相关文章

  1. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. Java数据解析---JSON

    一.Java数据解析分为:XML解析和JSON解析 XML解析即是对XML文件中的数据解析,而JSON解析即对规定形式的数据解析,比XML解析更加方便 JSON解析基于两种结构: 1.键值对类型 { ...

  3. Java数据解析之XML

    文章大纲 一.XML解析介绍二.Java中XML解析介绍三.XML解析实战四.项目源码下载   一.XML解析介绍   最基础的XML解析方式有DOM和SAX,DOM和SAX是与平台无关的官方解析方式 ...

  4. Java数据解析之JSON

    文章大纲 一.JSON介绍二.常见框架介绍与实战三.Studio中GsonFormat插件使用四.项目源码下载(含参考资料)五.参考文档   一.JSON介绍 1. 简介   JSON 的全称是 Ja ...

  5. Java数据解析---PULL

    安卓和JAVA解析xml文件的三种方式: 1.PULL解析 2.SAX解析 3.DOM解析 三者各有所长,依情况选择解析方式 1.PULL和SAX均采用流式解析,意味着只能从头读到底,无法像DOM解析 ...

  6. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...

  8. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  9. 网络相关系列之四:数据解析之SAX方式解析XML数据

    一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...

随机推荐

  1. Android开发工程师文集-相关控件的讲解,五大布局

    前言 大家好,给大家带来Android开发工程师文集-相关控件的讲解,五大布局的概述,希望你们喜欢 TextView控件 TextView控件有哪些属性: android:id->控件的id a ...

  2. Java学习笔记46(多线程三:线程之间的通信)

    多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...

  3. Liferay7 BPM门户开发之7: Activiti中的重要概念和主要数据库结构

    流程的人员参与角色: Assignee :签收者(即待办人) Candidate:候选人 Owner:拥有者 Starter:启动者 participant:参与者,包含查阅 流程变量的类型: Str ...

  4. app自动化测试之实战应用(百度app简单测试)

    模拟在百度app中搜索python相关内容代码如下: from appium import webdriver desired_caps = {} desired_caps['deviceName'] ...

  5. Golang标准库——io-结构

    结构 LimitedReader 定义 限制从Reader中读取的字节数. type LimitedReader struct { R Reader // underlying reader N in ...

  6. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十二):解决跨域问题

    什么是跨域? 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 如果一个请求地址里面的协议.域名和端口号都相同,就属于同源. ...

  7. Android FileObserver 实现原理(inotify)

    目录 0x0前言 0x01 FileObserver 使用实例 0x02 FileObserver 实现原理 0x04 完整Demo下载地址 0x0前言 之前在分析某个Android平台加固壳子的时候 ...

  8. Mongodb 命令清单

    一.数据库常用命令 # 切换/创建数据库 PRIMARY> use yourDB; #当创建一个集合(table)的时候会自动创建当前数据库# 查询所有数据库 PRIMARY> show ...

  9. golang map输出排序

    由于GoLang Map 内部存储是无序的,当需要按顺序获得map存储的key -value值时,应该对遍历出来的结果进行重新排序: 在go 1.8版本后,提供的slice sort 功能使排序更简单 ...

  10. spring的第二天

    spring的第二天 ssm框架 spring  在昨天简单的介绍了一下spring,那么今天接着继续介绍. spring值的注入 自动装配[autowire] 引用资源 applicationCon ...