微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML编程-SAX <span style="font-size:18px">XML<span style="font-family:宋体">编程</span><span style="font-family:Calibri">-SAX</span></span>

XML编程@H_502_3@-SAX@H_502_3@@H_502_3@

@H_502_3@@H_502_3@

基本概述


SAX,全称@H_502_3@Simple API for XML@H_502_3@,既是一种接口,也是一种软件包。它是一种@H_502_3@XML@H_502_3@解析的替代方法。@H_502_3@SAX@H_502_3@不同于@H_502_3@DOM@H_502_3@解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。@H_502_3@

SAX一个用于处理@H_502_3@XML@H_502_3@事件驱动的“推”模型,虽然它不是@H_502_3@W3C@H_502_3@标准,但它却是一个得到了广泛认可的@H_502_3@API@H_502_3@。@H_502_3@SAX@H_502_3@解析器不像@H_502_3@DOM@H_502_3@那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。@H_502_3@

PS:@H_502_3@SAX@H_502_3@不能够对@H_502_3@XML@H_502_3@文件进行修改删除添加操作。@H_502_3@@H_502_3@

为什么引入SAX@H_502_3@技术?@H_502_3@

DOM技术也是一种非常好的@H_502_3@DOM@H_502_3@解析方案,为什么还会出现@H_502_3@SAX@H_502_3@技术呢?原因很简单,那就是@H_502_3@DOM@H_502_3@是以文档树的结构对@H_502_3@XML@H_502_3@进行保存,这就表明是一次性将@H_502_3@XML@H_502_3@读入内存,那么这在大型的@H_502_3@XML@H_502_3@文件中是不可能的。所以才产生了@H_502_3@SAX@H_502_3@这种扫描解析的技术。@H_502_3@

原理图


@H_502_3@@H_502_3@

@H_502_3@@H_502_3@

SAX解析机制@H_502_3@


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

Java@H_502_3@中,通过继承@H_502_3@DefaultHandler @H_502_3@接口,可以开发一个@H_502_3@SAX@H_502_3@解析器。@H_502_3@

SAX的解析机制和事件监听机制很像,都是等待某一事件触发,然后调用相应方法。@H_502_3@

SAX解析器的最常用@H_502_3@5@H_502_3@个事件:@H_502_3@

1、@H_502_3@startDocument()@H_502_3@:这标识着@H_502_3@SAX@H_502_3@解析器扫描到文档开始位置。@H_502_3@

2、@H_502_3@endDocument()@H_502_3@,这标识着@H_502_3@SAX@H_502_3@解析器扫描到文档的结束位置。@H_502_3@

3、@H_502_3@startElement()@H_502_3@,这标识着@H_502_3@SAX@H_502_3@解析器扫描到一个元素的开始标签。@H_502_3@

4、@H_502_3@character()@H_502_3@,这标识着@H_502_3@SAX@H_502_3@解析器扫描到了一些文本,注意它是以@H_502_3@char@H_502_3@数组形式存放的。@H_502_3@

5、@H_502_3@endElement()@H_502_3@,这标识着@H_502_3@SAX@H_502_3@解析器扫描到了一个元素的结束标签。@H_502_3@

事件处理器常用方法参数列表

public void startDocument()

public void startElement(String uri, String localName, String qName,Attributes attributes)

uri - 名称空间 @H_502_3@URI@H_502_3@,如果元素没有任何名称空间 @H_502_3@URI@H_502_3@,或者没有正在执行名称空间处理,则为空字符串。@H_502_3@@H_502_3@

localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。@H_502_3@@H_502_3@

qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。@H_502_3@@H_502_3@

attributes - 附加到元素的属性。如果没有属性,则它将是空的 @H_502_3@Attributes @H_502_3@对象。@H_502_3@@H_502_3@

public void characters(char[] ch, int start, int length)

ch - @H_502_3@文档的所有字符@H_502_3@。@H_502_3@

start - 字符数组中的开始位置。@H_502_3@@H_502_3@

length - 从字符数组中使用的字符数。 @H_502_3@@H_502_3@

public void endElement(String uri, String localName, String qName)

uri - 名称空间 @H_502_3@URI@H_502_3@,如果元素没有任何名称空间 @H_502_3@URI@H_502_3@,或者没有正在执行名称空间处理,则为空字符串。@H_502_3@@H_502_3@

localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。@H_502_3@@H_502_3@

qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 @H_502_3@@H_502_3@

public void endDocument()

解析方式

通过解析器和事件处理器一起使用,可以解析XML@H_502_3@文档。@H_502_3@解析器可以使用JAXP@H_502_3@的@H_502_3@API@H_502_3@创建,创建出@H_502_3@SAX@H_502_3@解析器后,就可以指定解析器去解析某个@H_502_3@XML@H_502_3@文档。事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到@H_502_3@sax@H_502_3@解析器解析到的数据,从而可以决定如何对数据进行处理。@H_502_3@

解析步骤

1、通过调用@H_502_3@SAXParserFactory@H_502_3@的@H_502_3@newInstance()@H_502_3@方法获得@H_502_3@Sax@H_502_3@解析器工厂对象。@H_502_3@

2、通过@H_502_3@Sax@H_502_3@解析器工厂对象调用@H_502_3@newSAXParser()@H_502_3@方法获得解析器@H_502_3@SAXParser@H_502_3@对象@H_502_3@

3、通过调用解析器对象的@H_502_3@parse@H_502_3@方法将解析器与事件处理器对象关联@H_502_3@

案例:

XML6.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<班级 班次="1班" 编号="C1">
	<学生 地址="湖南" 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1">
		<名字>张三</名字>
		<年龄>20</年龄>
		<介绍>不错</介绍>
	</学生>
	<学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="C1">
		<名字>李四</名字>
		<年龄>18</年龄>
		<介绍>很好</介绍>
	</学生>
	<学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1">
		<名字>王五</名字>
		<年龄>22</年龄>
		<介绍>非常好</介绍>
	</学生>
	<学生 性别="男">
		<名字>小明</名字>
		<年龄>30</年龄>
		<介绍>好</介绍>
	</学生>
</班级>


package com.pc;
import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XML6{
	//使用sax技术去解析xml文件
	public static void main(String[] args) throws Exception, SAXException {
		// Todo Auto-generated method stub
		//1.创建SaxParserFactory
		SAXParserFactory spf=SAXParserFactory.newInstance();
		//2.创建SaxParser 解析器
		SAXParser saxParser=spf.newSAXParser();
		//3 把xml文件和事件处理对象关联
		saxParser.parse("src/com/pc/XML6.xml",new MyDefaultHandler2() );
	}
}
// 只显示学生的名字和年龄
class MyDefaultHandler2 extends DefaultHandler{
	private boolean isName=false;
	private boolean isAge=false;
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// Todo Auto-generated method stub
		String con=new String(ch,start,length);
		if(!con.trim().equals("")&&(isName||isAge)){
			System.out.println(con);
		}
		isName=false;
		isAge=false;
		//super.characters(ch, start, length);
	}
	@Override
	public void endDocument() throws SAXException {
		// Todo Auto-generated method stub
		super.endDocument();
	}
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		// Todo Auto-generated method stub
		super.endElement(uri, localName, name);
	}
	@Override
	public void startDocument() throws SAXException {
		// Todo Auto-generated method stub
		super.startDocument();
	}
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// Todo Auto-generated method stub
		if(name.equals("名字")){
			this.isName=true;
		}else if(name.equals("年龄")){
			this.isAge=true;
		}
	}
}
//定义事件处理类
class MyDefaultHandler1 extends DefaultHandler{
	//发现文档开始
	@Override
	public void startDocument() throws SAXException {
		// Todo Auto-generated method stub
		System.out.println("startDocument()");
		super.startDocument();
	}
	//发现xml文件中的一个元素
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		// Todo Auto-generated method stub
		System.out.println("元素名称="+name);	
	}
	//发现xml文件中的文本
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String con=new String(ch,start,length);
		//显示文本内容:
		if(!con.trim().equals("")){
			System.out.println(new String(ch,start,length));
		}
	}
	//发现xml文件一个元素介绍</xx>
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		// Todo Auto-generated method stub
		super.endElement(uri, localName, name);
	}
	//发现文档结束
	@Override
	public void endDocument() throws SAXException {
		// Todo Auto-generated method stub
		System.out.println("endDocument()");
		super.endDocument();
	}
}

以上就是XML编程-SAX 的内容,更多相关内容请关注编程之家(www.PHP.cn)!


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。