SAX

来源:互联网 发布:非凡软件站 恶心 编辑:程序博客网 时间:2024/06/09 20:39

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(">");}//处理文本数据(包括了空格文本数据)@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String text=new String(ch,start,length);System.out.println(text.trim());}//处理命名空间@Overridepublic void startPrefixMapping(String prefix, String uri)throws SAXException {System.out.println("前缀为: "+prefix);System.out.println("命名空间的名称为 "+uri);}@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stubsuper.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(或另一个过滤器)。 
  个过滤器), 

0 0
原创粉丝点击