一、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. MySQL:事务的隔离性

    [参考文章]:数据库的事务特性及隔离级别 1. 事务的四大特性 1.1 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用 ...

  2. HttpClient 传输文件的两种方式

    1. org.apache.commons.httpclient.HttpClient 1.1 pom <dependency> <groupId>org.apache.htt ...

  3. 使用speex动态链接库过程中遇到问题及解决方法

    本以为speex的应用程序很容易就能跑起来,可是,实际操作中才发现,这里面暴露 的问题还真不少.看来以后不能眼高手低了,知行合一,这个一定要牢记在心中. speex安装成功后,可以一直无法调用动态链接 ...

  4. Spring Boot Runner启动器

    Runner启动器 如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都 ...

  5. Spring Boot读取配置的 5 种方式

    读取application文件 在application.yml或者properties文件中添加: info.address=USA info.company=Spring info.degree= ...

  6. Autowired byType 与 byName 策略

    @Autowired是spring的注解,默认使用的是byType的方式向Bean里面注入相应的Bean.例如: @Autowiredprivate UserService userService;这 ...

  7. 基数排序的理解和实现(Java)

    基数排序是桶排序的扩展算法,其思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较排序. 算法流程: 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零. 从最低位开始,依次进行一次排 ...

  8. HW2017笔试编程题

    一.写一个转换字符串的函数 1.题目描述 将输入字符串中下标为偶数的字符连成一个新的字符串输出,需要注意两点: (1)如果输入字符串的长度超过20,则转换失败,返回“ERROR!”字符串: (2)输入 ...

  9. Django--Ajax 提交

    一 什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传 ...

  10. Intellij-忽略其他编译错误,运行当前文件

    在使用Intellij IDEA的时候,有时候想在项目中写个main()方法或者单元测试测试个功能,但是有其他文件编译出错IDEA就提示我说不能运行,很是烦恼. 能不能像Eclipse一样呢,其他编译 ...