Java数据解析---SAX
一、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的更多相关文章
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Java数据解析---JSON
一.Java数据解析分为:XML解析和JSON解析 XML解析即是对XML文件中的数据解析,而JSON解析即对规定形式的数据解析,比XML解析更加方便 JSON解析基于两种结构: 1.键值对类型 { ...
- Java数据解析之XML
文章大纲 一.XML解析介绍二.Java中XML解析介绍三.XML解析实战四.项目源码下载 一.XML解析介绍 最基础的XML解析方式有DOM和SAX,DOM和SAX是与平台无关的官方解析方式 ...
- Java数据解析之JSON
文章大纲 一.JSON介绍二.常见框架介绍与实战三.Studio中GsonFormat插件使用四.项目源码下载(含参考资料)五.参考文档 一.JSON介绍 1. 简介 JSON 的全称是 Ja ...
- Java数据解析---PULL
安卓和JAVA解析xml文件的三种方式: 1.PULL解析 2.SAX解析 3.DOM解析 三者各有所长,依情况选择解析方式 1.PULL和SAX均采用流式解析,意味着只能从头读到底,无法像DOM解析 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- 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来 ...
- 网络相关系列之四:数据解析之SAX方式解析XML数据
一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...
随机推荐
- ARM架构处理器扩展结构-NEON
是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令.多数据)扩展结构. 从智能手机和移动计算设备到HDTV,它 ...
- Tools - 使用Doxygen和Graphviz分析代码
简介 使用Doxygen来生成结构,使用Graphviz来显示结构: Doxygen:http://www.doxygen.nl/ 用来生成项目文档的工具软件,可将程序中的特定批注转换成为说明文件,还 ...
- Win10手记-为应用集成日志工具Logger
日志工具由来已久,是很受大家欢迎的debug工具.其中.NET平台上很出名的是log4net,但是由于Windows 10通用应用项目没有了System.Configuration引用,所以也就不能很 ...
- LeetCode--No.015 3Sum
15. 3Sum Total Accepted: 131800 Total Submissions: 675028 Difficulty: Medium Given an array S of n i ...
- Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)
注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...
- 使用First查找集合报错:序列不包含任何匹配元素
原因其实是很简单的: 使用First代表一定能找到,找不到就抛出异常,必须使用try……catch……进行异常的捕获. 推荐使用 FirstOrDefault 或Find 取序列中满足条件的第一个元 ...
- python-UiAutomator学习&使用
一.安装 源码地址: https://github.com/xiaocong/uiautomator#basic-api-usages ①下载zip包,解压到本地目录下 ②进入对应目录下,执行 $su ...
- epel安装第三方扩展源后,运行yum报错的解决方案
yum安装报错:Cannot retrieve metalink for repository: epel. Please verify its path and try again 解决方法: 一句 ...
- js精度溢出解决方案
一般参数值不能超过16位.如果超出16都是用0替代,导致我们查询不到自己想要的结果. 遇到此问题我们做如下修改 自己写属性 原始的: <a href="javascript:void( ...
- jquery插入,复制、替换和删除节点
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...