JAXP的SAX解析方式(理解过程)

2024-05-23 18:48

本文主要是介绍JAXP的SAX解析方式(理解过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.JAXP的DOM解析方式和SAX解析方式的区别:

1.DOM:在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

2.SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

2.JAXP的SAX解析(了解 解析的过程)

2.1* 只能做查询,不能做增删改。

2.2* SAX解析:解析器自动帮我们

1.* 解析器

1.* 获取解析器的工厂

2.* 获取解析器对象

3.* 解析XML(XML的文件的地址,事件处理器:DefaultHandler)         

2.* 事件处理器

* 自己编写的类,需要继承DefalutHandler类,重写三个方法。

* startElement()
* characters()
* endElement()

3. 图示:


4.代码示例:

<pre name="code" class="java">package cn.itcast.jaxp.sax;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class JaxpSaxTest {public static void main(String[] args) {try {run1();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 获取所有的解析内容* */public static void run1() throws Exception{//获取SAX的解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();//获取解析器SAXParser parser = factory.newSAXParser();//解析parser.parse("src/book2.xml", new MyHandler2());}
}/*** 获取作者标签文本*/
class MyHandler2 extends DefaultHandler{private boolean flag = false;//解析到作者标签时置为trueprivate int count = 0;@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if("作者".equals(qName)){flag = true;count++;}}/*** 控制characters的输出,只在解析坐着吧标签的时候才打印*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {//flag为true时才打印if(flag && count==1){String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串System.out.println(str);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//flag恢复到falseflag = false;}}/*** 自己事件处理器* 重名三方法* */
class MyHandler extends DefaultHandler{/*** 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("开始标签: " + qName);}/*** 只要解析到文本内容,就调用该方法*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串System.out.println(str);}/*** 解析到结束标签,默认调用该方法*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("结束标签: " + qName);}
}

 

2.3* SAX的解析原理:        

解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,(边读边解析)

都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,

会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。


事件处理器由程序员编写,程序员通过事件处理器中方法的参数,

就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
















这篇关于JAXP的SAX解析方式(理解过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996367

相关文章

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u