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(或另一个过滤器)。
个过滤器),
- SAX
- SAX
- sax
- sax
- SAX
- sax
- SAX
- Sax
- Sax .
- sax
- sax
- SAX
- sax
- sax
- sax
- SAX
- SAX
- SAX
- 自绘菜单的实现 ----------原作者querw
- 第102讲:通过案例解析Akka中的Actor运行机制以及Actor的生命周期学习笔记
- 递归调用
- 华为OJ题6---名字的漂亮度
- Hoj1161树状数组统计
- SAX
- 0915Android基础VideoView
- ImportError: No module named items
- PHP7与Swoole
- Android多媒体---VideoView(播放视频)
- 大素数判断和素因子分解(miller-rabin,Pollard_rho算法)
- C/C++ linux下光标定位和清屏函数(printf 实现)
- 【设计模式】Java 23种设计模式对比总结
- makefile文件格式