SAX

SAX概述

DOM适合对文档增删改,会将整个文档加载到内存中

SAX适合小信息的处理,单遍解析,不支持随机访问


SAX的工作机制:

SAX解析器在加载XML,遍历XML文档并在其主机应用程序中产生事件。大多数SAX会实现以下几种类型的事件:
1.在文档的开始和结束时触发文档处理事件

2.在文档内每一个XML元素都在接受解析的前后触发事件。任何元数据通常都是由单个的事件交付。

3.在处理文档的DTD或Schema时产生DTD或Schema事件

4.错误事件用来通知主机应用程序解析错误



常用接口


Attributes接口


ContentHandler接口


DTDHandler接口



EntityResolver接口


XMLReader接口


SAX错误处理程序的基本接口





SAX解析XML文档

1.处理文件的开始和结束

2.处理指令

3.处理开始和结束的标记

4.处理文本数据

5.处理空白

6.处理命名空间

7.处理实体

8.SAX应用程序异常


package SAX;

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class example {

	public static void main(String[] args) {

		try{
		SAXParserFactory factory = SAXParserFactory.newInstance();
		factory.setNamespaceAware(true);
		SAXParser saxParser = factory.newSAXParser();
		MyHandler handler = new MyHandler(new File("example.xml"));
		saxParser.parse(new File("example.xml"), handler);
		}catch(Exception e){
			e.printStackTrace();
		}
		 
		
	}

}
class MyHandler extends DefaultHandler{
	
		File file;
		long startTime,endTime;
		public MyHandler(File f){
			file = f;
		}
//处理文件开始
		public void startDocument(){
			startTime = System.currentTimeMillis();
			System.out.println("文件所在路径是"+file.getAbsolutePath());
			System.out.println("文件名字是"+file.getName());
			System.out.println("开始解析XML文件-----------");
			
		}
//处理文件结束
		public void endDocument(){
			System.out.println("解析XML文件结束----------");
			endTime=System.currentTimeMillis();
			System.out.println("文件解析共花费"+(endTime-startTime)+" 秒");
		}
	
//处理指令
		public void processingInstruction(String target,String data){
			
			System.out.println("处理的指令的名称是:"+target);
			System.out.println("处理指令的内容是:"+data);
			
		}
		
//处理开始标记
		public void startElement(String uri,String localName , String qName , Attributes attributes)throws SAXException{
			
			if(uri.length()>0){
				
				System.out.println("uri::"+uri);
			}
			
			System.out.print("< "+ qName+" " );
			for(int k=0;k<attributes.getLength();++k){
				System.out.print(attributes.getLocalName(k)+"=");
				System.out.print("\""+attributes.getValue(k)+"\"");
				
				
			}
			System.out.println(">");
		}
		

		//处理文本数据(包括了空格文本数据)
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
				String text=new String(ch,start,length);
		
				System.out.println(text.trim());
		}
		
		
		
		//处理命名空间
@Override
		public void startPrefixMapping(String prefix, String uri)
				throws SAXException {
				
	System.out.println("前缀为: "+prefix);
	System.out.println("命名空间的名称为 "+uri);
			
	
		}
	



		@Override
public void endPrefixMapping(String prefix) throws SAXException {
	// TODO Auto-generated method stub
	super.endPrefixMapping(prefix);
}
		//处理结束标记
		public void endElement(String uri,String localName,String qName)throws SAXException{
			
			System.out.println("</"+qName+">");
			
			
		}
	
	
	
}


SAX 过滤器:

1.一个SAX解析器可以拥有多个过滤器对象,不同的过滤器对象有不同的功能。如果一个解析器对象拥有多个过滤器对象,在解析的时候,把这些过滤器在次序上串接起来,XML文件中的事件首先传递给第一个过滤器,处理器把相应的内容做出更改之后,再把事件传递给下一个过滤器理器。事件经过多次处理之后,最后被传递给解析器的事件处理器。 

2.要使用SAX过滤器除了需要ContentHandler、ErrorHanlder等接口以外,还需要XMLReader接口和XMLFilter接口。XMLReader接口可以对XML文件进行分析,并以回调的形式将分析得到的事件信息发送给相应的事件处理器。XMLFilter接口继承了XMLReader接口,XMLFilter接口的对象就是SAX过滤器。与XMLReader接口不同的是它不XMLReader那样通过解析XML文件来获取事件,而是从其它的XMLReader中或其它的XMLFilter中获取事件,XMLFilter中有两个方法: 

    类似于DefaultHandler类,xml.sax.helpers包中提供了XMLFilterImpl类,该类实现了XMLFilter、ContentHandler、ErrorHanlder等接口。通过

  void setParent(XMLReader parent) :用于设定父XMLReader(或另一  XMLReader getParent() :用于获取父XMLReader(或另一个过滤器)。 
  个过滤器), 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值