开发者社区> 最美的回忆> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

sax解析

简介:
+关注继续查看

SAX 解析
1. SAX ( Simple Application interface for XML ), 是一组程序设计接口,采用 observer 模式,将XML文件视为一个文字流的数据,在读取XML 元素时触发一系列的事件

2. 使用DOM 时是将xml 文件解析为一个树状结构,并对树中的节点进行操作
使用SAX 加载XML文件时,他的操作像打开一个“顺序的文件字符流”,在读到XML元素的开始标记,结尾标记和内容标记时将产生一系列的事件
如一个简单的XML文件:<hello><message>hello XML!</message></hello>
会相应的触发:startDocument, startElement, characters, endElement, endDocument, 只需编写这些事件处理程序就可以解析XML文件了

3. SAX 可以高效的使用内存,因为SAX 只是顺序的读取XML 文件的内容,并不会将XML 文件完全加载,这样就比DOM 的处理效率高
但SAX 只能读取XML 文件的内容,而不能更改XML 的内容,也不能随机访问XML 元素 

4. 在SAX 中有4个处理器是要实现的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以处理不同的事件,这是比较麻烦的,
幸好SAX 定义了一个 DefaultHandler 类把这几个实现了,我们只需在 DefaultHandler中定义事件处理方法,然后注册到XMLReader,而SAXParser封装了XMLReader的实现类,
SAXParser又是由SAXParserFactory提供的,所以我们实际用到的类只有:SAXParserFactory,SAXParser,DefaultHandler

5. SAX 的解析步骤:
(1)写一个类继承 DefaultHandler, 实现自己的事件处理方法
(2)在主程序中建立 SAXParserFactory
(3)可以设置这个factory 的参数
(4)从这个factory 得到SAXParser
(5)解析XML文件

例子:

XML 文件:hr.xml
<?xml version="1.0" encoding="GB2312" ?> 
<!-- 个人履历表--> 
<resume>
<person id=
"01">
<name>张三</name> 
<birthday>03/24/1975</birthday> 
<phone>1111-1111</phone> 
<address>大连</address>
</person> 
<person id=
"02">
<name>李四</name> 
<birthday>9/26/1978</birthday> 
<phone>2222-2222</phone> 
<address>南京</address>
</person> 
<person id=
"03">
<name>王五</name> 
<birthday>11/09/1979</birthday> 
<phone>3333-3333</phone> 
<address>武汉</address>
</person>
</resume> 


import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class MySaxParser extends DefaultHandler {
public static void main( String[] args ){
try{
// 创建一个handler
DefaultHandler dh = new MySaxParser();
// 创建SAXParserFactory
SAXParserFactory spf = SAXParserFactory.newInstance();
// 从factory 中得到SAXParser
SAXParser sp = spf.newSAXParser();
// 用自定义的handler 解析xml
sp.parse( 
"08_02.xml", dh );
}catch( Exception e ){
e.printStackTrace();
}
}
public void startDocument(){

}
/**
* 当开始一个元素时打印出元素名和此元素的所有属性
*/

public void startElement(String uri,
String localName,
String qName,
Attributes attributes)
{
System.out.print( qName + 
":" ); 
int len = 0;
len = attributes.getLength();
if( len > 0 ){
System.out.print( 
"\t" + "attributes: " );
forint i=0; i<len; i++ )
System.out.print( attributes.getQName(i) + 
"=" + attributes.getValue(i) + "\t" );
//System.out.println(); 

}
/**
* 打印出元素内容
*/

public void characters(char[] ch,
int start,
int length)
{
String s = String.valueOf( ch, start, length );
System.out.print( s );
}
public void endElement(String uri,
String localName,
String qName)
{

}
public void endDocument(){

}
}
本文转自kenty博客园博客,原文链接
http://www.cnblogs.com/kentyshang/archive/2007/01/04/611204.html如需转载请自行联系原作者

kenty

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【AJAX】AJAX技术详细解析以及实例(2)
【AJAX】AJAX技术详细解析以及实例
61 0
SAP UI5 dialog style max-height
Created by Wang, Jerry, last modified on Apr 09, 2015
49 0
AJAX-跨域请求
1、什么是跨域请求 浏览器均默认开启了同源策略,它指Ajax请求所在的页面和被请求的页面在域名、端口均相同才能被访问,否则会提示如下错误: XMLHttpRequest cannot load xxxxxxx is not allowed by Access-Control-Allow-Origin. 2、JSONP解决方案 2.1 JSONP原理 JSONP 不是真正的AJAX请求,是利用script的src可可以跨域的特性,动态加载一段script脚本,脚本中包含需要的信息。
1065 0
aix 中域名解析的顺序
AIX 主机IP地址的解析顺序依次是dns/bind , nis,localDNS/BIND解析使用配置文件/etc/resolv.conf 默认的操作系统中是没有这个文件的,我们必须通过smit tcpip命令去创建,具体创建方法可以参考这个前辈的博客:http://blog.
1408 0
AJAX(1)
昨天有同事做了ajax的讲座,恩 虽然原来自己也看过ajax方面的东西,但在细节上,听了讲座还是觉得有了更深入的了解。 不敢独享 故分享于网上,望对诸君有些许作用。 本帖说的就是概念 发展 趋势,具体技术见帖2 AJAX 作为一个概念火了很久,很多人听过,但不知道是什么,表现又在哪里。 AJ
1139 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载