XML的SAX解析以及DOM解析和SAX解析区别
前言:
XML解析工具
DOM解析原理:1)JAXP (oracle-Sun公司官方)2)JDOM工具(非官方)3)Dom4J工具(非官方)三大框架(默认读取xml的工具就是Dom4j).......SAX解析原理:1)Sax解析工具(oracle-sun公司官方)
老样子,三个问题:
SAX解析是什么?
SAX怎么用?
SAX运用场景?
SAX是什么?
也是用来解析XML的
SAX解析工具- 内置在jdk中。org.xml.sax.*
SAX运用场景?
DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。
对内存要求比较要。
缺点: 不适合读取大容量的xml文件,容易导致内存溢出。
SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。
SAX解析工具核心:
核心的API:
SAXParser类: 用于读取和解析xml文件对象
parse(File f, DefaultHandler dh)方法: 解析xml文件
参数一: File:表示 读取的xml文件。
参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类
第一步:创建对象
//1.创建SAXParser对象SAXParser parser = SAXParserFactory.newInstance().newSAXParser();//2.调用parse方法/*** 参数一: xml文档* 参数二: DefaultHandler的子类 MyDefaultHandler()为自定义*/parser.parse(new File(".\\src\\Go\\person.xml"), new MyDefaultHandler());
注意:
这里创建SAXParser对象 不能直接通过构造函数来创造,因为用到了单例工厂模式。
链接:类 SAXParser的jdk文档
所以创建一个SAXParser对象 需要:
SAXParserFactory.newInstance().newSAXParser();
DefaultHandler类的API:后三个最重要
- void startDocument() : 在读到文档开始时调用
- void endDocument() :在读到文档结束时调用
- void startElement(String uri, String localName, String qName, Attributes attributes) :
读到开始标签时调用- void endElement(String uri, String localName, String qName) :读到结束标签时调用
- void characters(char[] ch, int start, int length) : 读到文本内容时调用
第二步:自定义类继承DefaultHandler重写方法
这些都是要重写的 举个例子:
public class MyDefaultHandler extends DefaultHandler {/*** 开始文档时调用*/@Overridepublic void startDocument() throws SAXException {System.out.println("MyDefaultHandler.startDocument()");}/*** 开始标签时调用* @param qName: 表示开始标签的标签名* @param attributes: 表示开始标签内包含的属性列表*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("MyDefaultHandler.startElement()-->"+qName);}/*** 结束标签时调用* @param qName: 结束标签的标签名称*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("MyDefaultHandler.endElement()-->"+qName);}/*** 读到文本内容的时调用* @param ch: 表示当前读完的所有文本内容* @param start: 表示当前文本内容的开始位置* @param length: 表示当前文本内容的长度* char[]( 张三 20) 100* 98 2 */ @Overridepublic void characters(char[] ch, int start, int length)throws SAXException {//得到当前文本内容String content = new String(ch,start,length);System.out.println("MyDefaultHandler.characters()-->"+content);}/*** 结束文档时调用*/@Overridepublic void endDocument() throws SAXException {System.out.println("MyDefaultHandler.endDocument()");}}
xml样例:
<?xml version="1.0" encoding="utf-8"?>
<contactList><contact id="001" name="eric"><name>张三</name><age>20</age><phone>134222223333</phone><email>zhangsan@qq.com</email><qq>432221111</qq></contact><contact id="002" name="jacky"><name>eric</name><age>20</age><phone>134222225555</phone><email>lisi@qq.com</email><qq>432222222</qq></contact>
</contactList>
结果:
MyDefaultHandler.startDocument()
MyDefaultHandler.startElement()-->contactList
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->contact
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->name
MyDefaultHandler.characters()-->张三
MyDefaultHandler.endElement()-->name
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->age
MyDefaultHandler.characters()-->20
MyDefaultHandler.endElement()-->age
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->phone
MyDefaultHandler.characters()-->134222223333
MyDefaultHandler.endElement()-->phone
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->email
MyDefaultHandler.characters()-->zhangsan@qq.com
MyDefaultHandler.endElement()-->email
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->qq
MyDefaultHandler.characters()-->432221111
MyDefaultHandler.endElement()-->qq
MyDefaultHandler.characters()-->MyDefaultHandler.endElement()-->contact
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->contact
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->name
MyDefaultHandler.characters()-->eric
MyDefaultHandler.endElement()-->name
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->age
MyDefaultHandler.characters()-->20
MyDefaultHandler.endElement()-->age
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->phone
MyDefaultHandler.characters()-->134222225555
MyDefaultHandler.endElement()-->phone
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->email
MyDefaultHandler.characters()-->lisi@qq.com
MyDefaultHandler.endElement()-->email
MyDefaultHandler.characters()-->MyDefaultHandler.startElement()-->qq
MyDefaultHandler.characters()-->432222222
MyDefaultHandler.endElement()-->qq
MyDefaultHandler.characters()-->MyDefaultHandler.endElement()-->contact
MyDefaultHandler.characters()-->MyDefaultHandler.endElement()-->contactList
MyDefaultHandler.endDocument()
注意:
问题:MyDefaultHandler.characters()–>空白 ?
答:
<contactList><contact>之间也是有文本的 是换行和空格 被characters方法读取了。
来看一下SAX解析XML的流程图:(图片来自传智播客)
回到开头SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。
总结:
==================DOM解析 vs SAX解析 ============================
DOM解析 :
原理: 一次性加载xml文档,不适合大容量的文件读取
DOM解析可以任意进行增删改成
DOM解析任意读取任何位置的数据,甚至往回读
DOM解析面向对象的编程方法(Node,Element,Attribute),
Java开发者编码比较简单。
SAX解析 :
原理: 加载一点,读取一点,处理一点。适合大容量文件的读取
SAX解析只能读取
SAX解析只能从上往下,按顺序读取,不能往回读
SAX解析基于事件的编程方法。java开发编码相对复杂。
XML操作:
1)Dom4j修改xml文档new XMLWrier();......2)xPath技术: 快速查询xml节点selectNodes()selectSinglNode(); 3) SAX解析SAXParser parseparser()DefaultHandler类:startElement();characters();endElement();
XML的SAX解析以及DOM解析和SAX解析区别相关推荐
- html页面解析 成dom树,将网页解析成dom树的几种方法
当需要将一个网页解析成比较直观的dom树形式,有以下几种方法. (1)MSHTML中提供的IWebBrowser2接口.输入为网页的url: IHTMLDocument2 *pDoc = NULL; ...
- 解析与DOM树构建之解析规则
因为解析是渲染引擎中一个非常重要的过程,所以我觉得有必要更加深入的了解一下解析过程.首先来介绍一下浏览器解析的规则. 所谓解析文档其实就是将文档内容转化为代码可以理解和使用的结构.解析的结果通常是一个 ...
- XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较
6月20日 XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较 1:DOM DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准.DOM 是以层次结 ...
- XML文件解析之--DOM与SAX
xml文件又称'可扩展性标记语言',可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml ...
- xml解析之dom、dom4j、SAX
一.XML: 1.概念:可扩展标记语言,标签都是自定义的,就是一个记录,不需要编译 2.xml与html的区别: 1.html标签是预编译的,xml标签是自由发挥的 2.html主要是用于页面展示,x ...
- XML解析之DOM、SAX、JAXP、DOM4J
XML解析之DOM.SAX.JAXP.DOM4J 1. DOM与SAX XML是 一种通用的数据交换格式,可以使数据在各种应用程序之间轻松地实现数据交换. 虽然XML有各种各样的优点,但对于XML的解 ...
- XML解析(一),SAX解析XML
转载自 XML解析(一),SAX解析XML 一.概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...
- XML——XML解析之DOM
1.XML编程 XML编程,就是对XML文件进行crud操作. 那么为什么要用java或者C/C++对XML进行crud操作呢? 1.XML作为数据传递需要解析 2.XML作为配置文件需要读取 3.X ...
- XML解析之DOM解析详解
一.概念 xml文件多用于信息的描述,所以在得到一个xml文档之后按照xml中的元素取出对应的信息就是xml的解析.Xml解析有两种方式,一种是DOM解析,另一种是SAX解析,两种操作的方式如图. 二 ...
最新文章
- c++中使用Tesseract-OCR
- html div最多50个字符,javascript-计算多少个字符(来自一个字符串)将适合一个div而没有使其换行?...
- Android客户端与服务器端交互,如何保持session回话
- 修改手机屏幕刷新率_手机屏幕没有高刷新率算不上旗舰机?看看网友都是如何回答的...
- MSSQL-字符串分离与列记录合并成一行混合使用
- leetcode160 相交链表
- Ubuntu 查看磁盘空间 及目录容量
- 使用Python编写打字训练小程序
- java spark yarn_《Spark官方文档》在YARN上运行Spark
- matplotlib绘图跳过时间段的处理方案
- 奇怪的比赛--蓝桥杯
- 16.2互联网媒体信息讽刺识别
- aarch64 arm上交叉编译mysql-2.7.35
- jsp----Session
- CPU /磁盘I/O /内存
- Reeder 5.0.3 将RSS阅读体验发挥到极致
- H5+CSS3移动商城界面.七天从零实战课程-会员_登录
- java罗盘说明_综合罗盘各层应用说明
- 分享一个Java和Android学习视频
- css3 设置图片变灰(在微信端不能正常) 和透明