旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

XML编程-SAX【XML教程】,XML,SAX

作者:搜教程发布时间:2019-12-01分类:XML教程浏览:136评论:0


导读:XML编程-SAX基础概述SAX,全称SimpleAPIforXML,既是一种接口,也是一种软件包。它是一种XML剖析的替换要领。SAX不同于DOM剖析,它...

XML编程-SAX

基础概述


SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML剖析的替换要领。SAX不同于DOM剖析,它逐行扫描文档,一边扫描一边剖析。因为应用程序只是在读取数据时搜检数据,因而不需要将数据存储在内存中,这关于大型文档的剖析是个庞大上风。

SAX是一个用于处置惩罚XML事宜驱动的“推”模子,虽然它不是W3C规范,但它倒是一个取得了普遍承认的APISAX剖析器不像DOM那样竖立一个完全的文档树,而是在读取文档时激活一系列事宜,这些事宜被推给事宜处置惩罚器,然后由事宜处置惩罚器供应对文档内容的接见。

PSSAX不能够对XML文件举行修正,删除、增加操纵。

为何引入SAX手艺?

DOM手艺也是一种非常好的DOM剖析计划,为何还会涌现SAX手艺呢?缘由很简单,那就是DOM是以文档树的构造对XML举行保留,这就表明是一次性将XML读入内存,那末这在大型的XML文件中是不可能的。所以才产生了SAX这类扫描剖析的手艺。

原理图


SAX剖析机制


SAX剖析许可在读取文档的时刻,即对文档举行处置惩罚,而没必要比及全部文档装载完才会文档举行操纵。

Java中,经由过程继续DefaultHandler 接口,能够开辟一个SAX剖析器。

SAX的剖析机制和事宜监听机制很像,都是守候某一事宜触发,然后挪用响应要领。

SAX剖析器的最经常运用5个事宜:

1startDocument():这标识着SAX剖析器扫描到文档最先位置。

2endDocument(),这标识着SAX剖析器扫描到文档的完毕位置。

3startElement(),这标识着SAX剖析器扫描到一个元素的最先标签。

4character(),这标识着SAX剖析器扫描到了一些文本,注重它是以char数组情势寄存的。

5endElement(),这标识着SAX剖析器扫描到了一个元素的完毕标签。

事宜处置惩罚器经常运用要领参数列表

public void startDocument()

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

uri - 称号空间 URI,假如元素没有任何称号空间 URI,或许没有正在实行称号空间处置惩罚,则为空字符串。

localName - 当地称号(不带前缀),假如没有正在实行称号空间处置惩罚,则为空字符串。

qName - 限制的称号(带有前缀),假如限制的称号不可用,则为空字符串。

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

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

ch - 文档的一切字符

start - 字符数组中的最先位置。

length - 从字符数组中运用的字符数。

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

uri - 称号空间 URI,假如元素没有任何称号空间 URI,或许没有正在实行称号空间处置惩罚,则为空字符串。

localName - 当地称号(不带前缀),假如没有正在实行称号空间处置惩罚,则为空字符串。

qName - 限制的称号(带有前缀),假如限制的称号不可用,则为空字符串。

public void endDocument()

剖析体式格局

经由过程剖析器和事宜处置惩罚器一同运用,能够剖析XML文档。剖析器能够运用JAXPAPI建立,建立出SAX剖析器后,就能够指定剖析器去剖析某个XML文档。事宜处置惩罚器由程序员编写,程序员经由过程事宜处置惩罚器中要领的参数,就能够很轻松地取得sax剖析器剖析到的数据,从而能够决议怎样对数据举行处置惩罚。

剖析步骤

1、经由过程挪用SAXParserFactorynewInstance()要领取得Sax剖析器工场对象。

2、经由过程Sax剖析器工场对象挪用newSAXParser()要领取得剖析器SAXParser对象

3、经由过程挪用剖析器对象的parse要领将剖析器与事宜处置惩罚器对象关联

案例:

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 的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:XMLSAX


欢迎 发表评论: