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

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集