SAX
是一个
event-driven
serial-access
类
型的
XML
处理机制。
event-driven
:
SAX
提供
面向
elements,
text
和
comments
等
不同
事件的处理
方法,当解析器
读
取
XML
数据
时
就会
调
用
这
些方法。
serial-access
:
SAX
工作起来有点像一个
连续
的
I/O
流,能
实时
的
传
送和接收数据,它不会去构造
XML
的
树
形
结
构,所以只需要很少的内存。当然
这
在另一方面
,
也
导
致了你不能退回到早前
读
取的一个
element
或者跳到后面
还
未
读
到的
element
。
When To Use SAX
因
为
SAX
是
处
理
XML
文件的最快的,内存需求最小的
解析器
,所以当你只需要
简单
地
读取
数据,好
让
你的程序运行
这
些数据的
时候
,SAX
是很好的
选择
。因此,
SAX
常被用于
servlet
和面向
网络
编程的存取
XML
文件。
The SAX Packages
SAX
解析器存在与
JDK
如下的包中:
org.xml.sax:the SAX interfaces
org.xml.sax.ext : SAX extensions
org.xml.sax.helpers : helper classes
javax.xml.parsers : the SAXParserFactory class
SAX API
概述
附件2是
SAX API
的略图。
SAX
解析器包含了一个
SAXReader
实例,当解析器的
parse
方法被调用时,
reader
会调用对不同事件的处理方法
(
event-driven
)
。
这些方法在以下四种
handler
中被定义。用户可以在自定义的解析器中重写这些方法。
- org.xml.sax.ContentHandler : Receive notification of the logical content of a document.
- org.xml.sax.EntityResolver : Basic interface for resolving entities.
- org.xml.sax.DTDHandler : Receive notification of basic DTD-related events.
- org.xml.sax.ErrorHandler : Basic interface for SAX error handlers.
DefaultHandler
:适配了上面的四个接口,可用于不同事件的处理
自定义
SAX
解析器
以下是自定义一个SAX解析器的详细方法:
1.继承DefaultHandler
因为DefaultHandler同时实现了EntityResolver,DTDHandler,ContentHandler和ErrorHandler四个接口,
这样你就可以在你的XML解析器中调用或重写这四个接口中定义的面向不同事件的处理方法。
2.创建简单的parser(Validating parser)
创建一个parser,并使用Schema或DTD对XML文件进行校验
// Use an instance of ourselves as the SAX event handler
DefaultHandler handler = new MyHandler();
// Use the validating parser
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
// Parse the input
SAXParser saxParser = factory.newSAXParser();
saxParser.parse( new File("XXX"), handler );
} catch (Throwable t) {
t.printStackTrace();
}
3.ContentHandler
1)处理Document 事件的method
- startDocument: 开始解析XML文件,此方法只会被调用一次
- endDocument: 解析XML文件结束
2)处理Element 事件的method
- startElement: 开始解析XML文件的一个元素,在此方法中,可以获得该元素的属性和其对应的value值
- endElement: 解析该元素完毕
3)处理Character 事件的method
- characters: 用于解析元素中的字符数据
注:当XML文档中没有使用DTD进行校验时,当遇到whitespace时,该方法也会被调用。
例:
<element1 att1="value1"> ---Element 事件
These are characters. ---Character 事件
</element1> ---Element 事件
4)其他method
- setDocumentLocator: 该方法只在解析开始前被调用一次。用户可获得当前所解析的XML文件的位置和public
identifier等信息。
- ignorableWhitespace: 使用DTD校验时,通过重写此方法,用户可以查看XML中哪些地方存在whitespace
- processingInstruction: 通过此方法可以获得XML中定义的命令(target)和命令所处理的内容(data)
例:
<?my.presentation.Program QUERY="exec, tech, all"?>
target: my.presentation.Program
data: QUERY="exec, tech, all"
4.ErrorHandler
解析XML时发生的异常包括三种:a fatal error, an error, and a warning.
-fatalError(SAXParseException): 用于处理致命error
-error(SAXParseException): 用于处理非致命error,发生于对XML进行校验时。默认是被忽略的。由于当一个XML
发生校验错误时,用户可能不希望再解析下去了,此时,可以将此类异常自定义为致命error抛出。
-warning(SAXParseException): 用于处理警告。默认是被忽略的。用户可以通过自定义的方式打印出异常具体
的发生地点和信息。
5.DTDHandler
事件处理method
-notationDecl: Receive notification of a notation declaration event.
-unparsedEntityDecl: Receive notification of an unparsed entity declaration event.
6.EntityResolver
事件处理method
-resolveEntity: 该方法用于将public ID (URN)装换为system ID (URL),返回一个InputSource object。
7.LexicalHandler
SAX中使用org.xml.sax.ext.LexicalHandler来处理comments, CDATA sections和references。
1)实现LexicalHandler接口
2)创建一个parser
// Use an instance of ourselves as the SAX event handler
DefaultHandler handler = new MyHandler();
// Use the validating parser
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
// Parse the input
SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",handler);
saxParser.parse( new File("XXX"), handler );
} catch (Throwable t) {
t.printStackTrace();
}
3)事件处理method
-comment(String comment): 解析XML文件中的注释
-startCDATA(), endCDATA(): Tells when a CDATA section is starting and ending, which tells your
application what kind of characters to expect the next time characters()is called
-startEntity(String name), endEntity(String name): Gives the name of a parsed entity
-startDTD(String name, String publicId, String systemId), endDTD(): Tells when a DTD is being
processed, and identifies it
SAX Sample
附件1(我将官网上的sample进行整合,基本上囊括了上述所有的知识点)用于解析一个XML文件,并将其详细信息(片段如下)打印出来。
输出片段:
COMMENT: SUBSTITUTIONS WORK IN ATTRIBUTES, TOO
ELEMENT: <slideshow
ATTR: title "WonderWidget Slide Show"
ATTR: date "Date of publication"
ATTR: author "Yours Truly"
>
IGNORABLE
COMMENT: PROCESSING INSTRUCTION
IGNORABLE
- 大小: 37.4 KB
分享到:
相关推荐
SAX (Simple API for XML) 是一种基于事件驱动模型的 XML 解析技术。与 DOM (Document Object Model) 解析不同,SAX 不会将整个 XML 文档加载到内存中,而是逐行读取并解析 XML 文件,在遇到特定元素时触发相应的...
SAX(Simple API for XML)是一种基于事件驱动的解析方式,相较于DOM(Document Object Model)解析,SAX具有低内存占用和高效解析速度的优势。本文将深入讲解如何在Android中使用SAX解析XML以及如何通过SAX方式创建...
3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...
### SAX(Simple API for XML) SAX解析与DOM相反,它是一种基于事件的解析方法。在解析XML文档的过程中,SAX会逐个读取XML文档中的内容,并触发一系列事件(如开始标签、结束标签、字符数据等)。开发者通过实现...
2. 解析:解析器读取XML文档,构建DOM(Document Object Model)树或SAX(Simple API for XML)事件流。 - DOM解析:将整个XML文档加载到内存中形成树形结构,便于查找和操作任意节点。 - SAX解析:逐行读取,事件...
3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...
SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,以流式处理XML文档,具有内存占用小、解析速度快的特点,特别适用于处理大型XML文档。 ### 1. SAX解析原理 SAX解析器读取XML文档时,遇到元素...
C++中,这通常通过DOM(Document Object Model)或SAX(Simple API for XML)解析库来实现。DOM解析会一次性加载整个XML文档到内存,适合小型文件;SAX则采用事件驱动,逐行读取,适合大文件。在本项目中,开发者...
SAX(Simple API for XML)是一种轻量级的解析XML的API,它在Java环境中广泛使用。与DOM(Document Object Model)解析器不同,SAX不将整个XML文档加载到内存中,而是以事件驱动的方式逐个处理XML文档的元素、属性和...
3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...
3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式处理XML文档,非常适合处理大型XML文件,因为它不会一次性加载整个文档到内存中,从而节省了资源。本篇将详细讲解如何在Android环境中使用SAX解析...
SAX(Simple API for XML,XML简易应用程序接口)是一种基于事件驱动模型的API,它不将整个XML文件加载进内存,而是逐行处理,这在处理大型文件时非常高效。 #### 二、XML文件结构解析 在给定的例子中,XML文件...
在 Java 中,XML 解析通常有两种主要的方法:SAX (Simple API for XML) 和 DOM (Document Object Model)。SAX 是一种事件驱动的解析器,适合处理大型 XML 文件,因为它不需要一次性加载整个文档到内存中。DOM 则是...
### Java与XML入门及处理实例详解 #### 一、XML简介 XML,即**可扩展标记语言**(Extensible Markup Language),是一种类似于HTML的标记语言,但它更多地被用于存储和传输数据,而不是像HTML那样主要用于定义和显示...
SAX(Simple API for XML)是一种基于事件驱动的XML解析技术,与DOM形成鲜明对比。SAX的优势在于其即时处理特性,即解析器在读取文档的同时即可处理数据,无需等待整个文档加载完成。这种处理方式尤其适用于大型文档...
SAX(Simple API for XML)是一种事件驱动的解析器,适合处理大型XML文档,因为它不需要将整个文档加载到内存中。而StAX(Streaming API for XML)则提供了读写XML流的方式,允许开发者以迭代的方式处理XML数据,...