xml基础--解析(SAX)

来源:互联网 发布:深圳买房 知乎 编辑:程序博客网 时间:2024/05/29 03:55

1.简介:

1>定义:SAX(Simple Apis for XML) XML简单应用程序接口.SAX提供的访问模式是一种顺序模式,是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列的事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称件事件驱动接口

2>SAX与DOM的区别:

DOM--解析XML时,首先要将XML文档加载到内存当中,然后可以通过随机访问方式访问内存中的DOM树,访问大型的xml文档时会出现内存溢出的错误;

SAX--解析XML时,是基于事件而且是顺序执行的,一旦经过了某个元素,就没有办法再去访问了,SAX不必将整个XML文档加载到内存中,因此占用的内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析。

3>SAX使用的观察者模式,SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX提供了一种顺序访问机制,对于已经分析过的部分,不能再倒回重新处理。SAX之所以叫做"简单"应用程序接口,是因为SAX分析只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,它只顺序地检查XML文档中的字节流,判断当前字是XML语法中的哪一部分,是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现,同DOM分析器相比,SAX分析器缺乏灵活性。然而,由于SAX分析器实现简单,对内存要求较低,因此实现效率比较高,对于那些只需要访问XML文档中的数据而不需要对文档进行更改的应用程序来说。SAX分析器更为适合。

4>SAX分析器构成框架:

SAX分析器同DOM解析器相同也使用了工厂方法模式,上图中的SAXParserFactory用来生成一个分析器实例。XML文档从左侧箭头所示处读入,当分析器对文档进行分析时,就会触发在DocmentHandler, ErrorHandler,DTDHandler以及EntityResolver接口中定义的回调方法,应用程序需要去实现这些接口。

2.SAX解析器详解:

1>org.xml.sax.helpers.DefaultHandler类的方法:

2>解析步骤:

a.获得SAX解析器工厂实例:

    SAXParserFactory factory=SAXParserFactory.newInstance();

b.获得SAX解析器实例:

   SAXParser parser=factory.newSAXParser();

c.开始解析XML文档:
     parser.parse(new File("student.xml"), new MyHandler());
     

class MyHandler extends DefaultHandler{private Stack<String> stack=new Stack<String>();private String name;private String gender;private String age;@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {stack.push(qName);for (int i = 0; i < attributes.getLength(); i++) {String attrName=attributes.getQName(i);String attrValue=attributes.getValue(i);System.out.println(attrName+":"+attrValue);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String tag=stack.peek();if("姓名".equals(tag)){name=new String(ch,start,length);}else if("性别".equals(tag)){gender=new String(ch,start,length);}else if("年龄".equals(tag)){age=new String(ch,start,length);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {stack.pop();if("学生".equals(qName)){System.out.println("姓名:"+name);System.out.println("性别:"+gender);System.out.println("年龄:"+age);System.out.println();}}}

原创粉丝点击