精华内容
参与话题
问答
  • SAX

    2015-09-21 08:18:04
    SAX概述 DOM适合对文档增删改,会将整个文档加载到内存中 SAX适合小信息的处理,单遍解析,不支持随机访问 SAX的工作机制: SAX解析器在加载XML,遍历XML文档并在其主机应用程序中产生事件。大多数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(或另一个过滤器)。 
      个过滤器), 

    展开全文
  • Sax

    2011-09-29 14:04:13
    SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器: • 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。 • 解析器采用...

    l     SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:

    •       解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。

    •       解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

    •       事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

    l     阅读ContentHandler API文档,常用方法:startElement、endElement、characters

    l     使用SAXParserFactory创建SAX解析工厂

    SAXParserFactory spf = SAXParserFactory.newInstance();

    l     通过SAX解析工厂得到解析器对象         

    SAXParser sp = spf.newSAXParser();

    l     通过解析器对象得到一个XML的读取器

    XMLReader xmlReader = sp.getXMLReader();

    l     设置读取器的事件处理器         

    xmlReader.setContentHandler(new BookParserHandler());

    l     解析xml文件 

    xmlReader.parse("book.xml");

    例子:package cn.csdn.dom;

     

    import java.io.File;

     

    import javax.xml.parsers.ParserConfigurationException;

    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 SAXTest {

          public static void main(String[] args) throws Exception, SAXException{

               //获取SAX解析器工厂类的对象

               SAXParserFactory factory=SAXParserFactory.newInstance();

               //获取SAX解析器

               SAXParser sax=factory.newSAXParser();

               //通过sax解析器解析xml文档

               sax.parse(new File("src/book.xml"), new BookHandler());

              

          }

    }

     

    class BookHandler extends DefaultHandler{

     

          private boolean flag=false;

          @Override

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

                     throws SAXException {

               // TODO Auto-generated method stub

               //super.characters(ch, start, length);

               if(flag)

                     System.out.println("元素的内容为:"+new String(ch,start,length));

          }

     

          @Override

          public void endDocument() throws SAXException {

               // TODO Auto-generated method stub

               //super.endDocument();

               System.out.println("xml文档结束le");

          }

     

          @Override

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

                     throws SAXException {

               // TODO Auto-generated method stub

               //super.endElement(uri, localName, qName);

               //System.out.println("元素的结束:"+qName);

               if(qName.equals("书"))

                     flag=false;

              

          }

     

          @Override

          public void startDocument() throws SAXException {

               // TODO Auto-generated method stub

               //super.startDocument();

               System.out.println("xml文档的开始");

          }

     

          @Override

          public void startElement(String uri, String localName, String qName,

                     Attributes attributes) throws SAXException {

               // TODO Auto-generated method stub

               //super.startElement(uri, localName, qName, attributes);

               //System.out.println("元素的开始:"+qName);

               if(qName.equals("书")){

                     System.out.println("元素的开始:"+qName);

                     flag=true;

               }

          }

         

         

         

    }

     

     

    展开全文
  • sax

    2012-01-05 20:09:12
    Package org.xml.sax 介绍 Interfaces 接口 Attributes 定义了一个属性列表接口,供访问元素的属性列表而用。 ContentHandler 处理解析文档内容时产生的事件。 DTDHandler 处理解析DTD时的相应事件。 ...
    Package org.xml.sax 介绍 
    Interfaces 接口
    Attributes 定义了一个属性列表接口,供访问元素的属性列表而用。
    ContentHandler 处理解析文档内容时产生的事件。
    DTDHandler 处理解析DTD时的相应事件。
    EntityResolver 处理外部实体。
    ErrorHandler 处理解析过程中所遇到的文档错误事件。
    Locator 为了定位解析中产生的内容事件在文档中的位置而准备的一个定位器接口。
    XMLFilter 提供了一个方便应用开发的过滤器接口。
    XMLReader 任何兼容SAX2的解析器都要实现这个接口,这个接口让应用程序可以设置或查找features和properties,注册各种事件处理器,以及开始解析文档。
    Classes
    InputSource 为XML实体准备的输入源。
    Exceptions
    SAXException 包装了一般的SAX错误和警告。  
    SAXNotRecognizedException 为识别不出某些标识而抛出的异常。  
    SAXNotSupportedException 为不支持某个操作而抛出的异常。
    SAXParseException 包装了一个关于XML解析的错误或者警告。


    Package org.xml.sax.helpers 帮助类所在的包
    Classes 类
    AttributesImpl 对Attributes接口的缺省实现
    NamespaceSupport 提供名称空间支持。
    DefaultHandler 缺省实现了四个处理器接口,方便用户开发,在开发过程中会经常用到。
    LocatorImpl 提供了一个对Locator接口的实现
    XMLFilterImpl 对过滤器接口的实现,使用过滤器进行应用程序开发时,继承这个类很方便。
    XMLReaderFactory 为方便创建不同的XMLReader而提供。也会经常用到。


    理解并使用SAX
    SAX 的设计实现与DOM是完全不同的!DOM处理XML文档是基于将XML文档解析成树状模型,放入内存进行处理。而SAX则是采用基于事件驱动的处理模式,它将XML文档转化成一系列的事件,由单独的事件处理器来决定如何处理。为了了解如何使用SAX API处理XML文档,这里先介绍一下SAX所使用的基于事件驱动的处理模式。

    这种基于事件的处理模式是一种通用的程序设计模式,被广泛应用于GUI设计。在JAVA的AWT,SWING以及JAVA BEANS中就有它的身影。而SAX的基于事件驱动的处理模式就与上面三者中的非常相像。

    基于事件的处理模式主要是围绕着事件源以及事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象被称为事件源,而可以针对事件产生响应的对象就被叫做事件处理器。事件源和事件处理器是通过在事件源中的事件处理器注册方法连接的。这样当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就获得了处理。当然在事件源调用事件处理器中特定方法的时候,会传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据事件信息来决定自己的行为。

    在 SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parse()方法来开始解析XML文档并根据文档内容产生事件。而事件处理器则是org.xml.sax包中的ContentHandler,DTDHandler,ErrorHandler,以及 EntityResolver这四个接口。它们分别处理事件源在解析过程中产生的不同种类的事件(其中DTDHandler是为解析文档DTD时而用)。而事件源XMLReader和这四个事件处理器的连接是通过在XMLReader中的相应的事件处理器注册方法set***()来完成的。详细介绍请见下表: 处理器名称 所处理事件 注册方法
    org.xml.sax.ContentHandler 跟文档内容有关的所有事件:
    文档的开始和结束
    XML元素的开始和结束
    可忽略的实体
    名称空间前缀映射开始和结束
    处理指令
    字符数据和可忽略的空格
    XMLReader中的setContentHandler(ContentHandler handler)方法
    org.xml.sax.ErrorHandler 处理XML文档解析时产生的错误。如果一个应用程序没有注册一个错误处理器类,会发生不可预料的解析器行为。 setErrorHandler(ErrorHandler handler)
    org.xml.sax.DTDHandler 处理对文档DTD进行解析时产生的相应事件 setDTDHandler(DTDHandler handler)
    org.xml.sax.EntityResolver 处理外部实体 setEntityResolver(EntityResolver resolver)


    在这四个处理器接口中,对我们最重要的是ContentHandler接口。下面让我们看一下对其中方法的说明: 方法名称 方法说明
    public void setDocumentLocator(Locator locator) 设置一个可以定位文档内容事件发生位置的定位器对象
    public void startDocument() throws SAXException 用于处理文档解析开始事件
    public void endDocument() throws SAXException 用于处理文档解析结束事件
    public void startPrefixMapping(java.lang.String prefix, java.lang.String uri) throws SAXException 用于处理前缀映射开始事件,从参数中可以得到前缀名称以及所指向的uri
    public void endPrefixMapping(java.lang.String prefix) throws SAXException 用于处理前缀映射结束事件,从参数中可以得到前缀名称
    public void startElement(java.lang.String namespaceURI,java.lang.String localName,java.lang.String qName,Attributes atts) throws SAXException 处理元素开始事件,从参数中可以获得元素所在名称空间的uri,元素名称,属性列表等信息
    public void endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName) throws SAXException 处理元素结束事件,从参数中可以获得元素所在名称空间的uri,元素名称等信息
    public void characters(char[] ch, int start, int length) throws SAXException 处理元素的字符内容,从参数中可以获得内容
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException 处理元素的可忽略空格
    public void processingInstruction(java.lang.String target, java.lang.String data) throws SAXException 处理解析中产生的处理指令事件


    这里再介绍一下org.xml.sax.XMLReader中的方法,然后让我们看一个具体的例子。XMLReader是所有兼容SAX2的解析器都要实现的接口,由它的方法开始解析文档,并且调用它的注册方法来注册各种事件处理器。请看下表: 方法名称 方法介绍
    public Boolean getFeature(java.lang.String name)throws SAXNotRecognizedException,SAXNotSupportedException 得到某个feature的值
    public void setFeature(java.lang.String name,boolean value) throws SAXNotRecognizedException,SAXNotSupportedException 设置某个feature的值,例如,如果需要解析器支持对文档进行验证那么就这么调用本方法。myReader.setFeature(http://xml.org/sax/features/validation,true);其中myReader是XMLReader的实例。
    public java.lang.Object getProperty(java.lang.String name)throws SAXNotRecognizedException,SAXNotSupportedException 返回一个property的值
    public void setProperty(java.lang.String name,java.lang.Object value)throws SAXNotRecognizedException,SAXNotSupportedException 设置一个property的值
    public void setEntityResolver(EntityResolver resolver) 注册处理外部实体的EntityResolver
    public EntityResolver getEntityResolver() 得到系统中注册的EntityResolver
    public void setDTDHandler(DTDHandler handler) 注册处理DTD解析事件的DTDHandler
    public DTDHandler getDTDHandler() 得到系统中注册的DTDHandler
    public void setContentHandler(ContentHandler handler) 注册处理XML文档内容解析事件的ContentHandler
    public ContentHandler getContentHandler() 得到系统中注册的ContentHandler
    public void setErrorHandler(ErrorHandler handler) 注册处理文档解析错误事件的ErrorHandler
    public ErrorHandler getErrorHandler() 得到系统中注册的ErrorHandler
    public void parse(InputSource input)throws java.io.IOException,SAXException 开始解析一个XML文档。

    public void parse(java.lang.String systemId)throws java.io.IOException,SAXException 开始解析一个使用系统标识符标识的XML文档。这个方法只是上面方法的一个快捷方式它等同于:parse(new InputSource(systemId));





            // 初始化reader
            XMLReader reader = XMLReaderFactory.createXMLReader
                             ("org.apache.xerces.parsers.SAXParser") ;

            // 创建DefaultHandler的实例
            DefaultHandler defaultHandler=new MyDefaultHandler();

            //在reader中将defaultHandler注册为ContentHandler
            reader.setContentHandler(defaultHandler);

            //在reader中将defaultHandler注册为ErrorHandler
            reader.setErrorHandler(defaultHandler);

            // 开始解析文档
            reader.parse(args[0]);




    展开全文
  • SAX解析

    2019-12-17 15:03:31
    SAX(Simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反...

    SAX(Simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂,不允许修改文档。

    DOM和SAX其实都是语言无关的,并非JAVA所独有,也就是说,只要有相应的语言实现,DOM和SAX可以应用在任何面向对象的语言中。

    SAX是什么?

    SAX是SIMPLE API FOR XML的缩写,与DOM比较而言,SAX是一种轻量型的方法。SAX解析工具- 内置在jdk中。org.xml.sax.*

    1.DOM解析原理:

    一次性把xml文档加载进内存,然后在内存中构建Document树;

    对内存要求比较高;

    缺点:不适合读取大容量的xml文件,容易导致内存溢出。

    2.SAX解析原理:

    加载一点,读取一点,处理一点;

    对内存要求比较低。

    3.SAX优缺点:

    优点:

    SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手。

    缺点:

    但是同时,其仍然有一些不足之处也困扰广大的开发人员:首先是它十分复杂的 API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。

    @面试题:简述DOM与SAX解析的区别:
    在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个NODE对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事。这时候,一个较好的替代解决方法就是SAX。

    SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。在XMLReader接受XML文档,在读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的,这和DOM区别很大。

    解析开始之前,需要向XMLReader注册一ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义了很多方法,比如startDocument(),它定制了当在解析过程中,遇到文档开始时应该处理的事情。当XMLREADER读到合适的内容,就会抛出相应的事件,并把这个事件的处理权代理给ContentHandler,调用其相应的方法进行响应。
    在这里插入图片描述

    展开全文
  • Java Sax解析xml

    万次阅读 2018-01-23 10:06:24
    SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM解析,PULL解析(Android特有),SAX与DOM不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边...
  • 2017/3/12 20.9 xml.sax 支持SAX2解析器 Python 3.6.1rc1文档 20.9xml.saxSAX2解析器支持 源代码 Lib / xml / sax / _ init.py 该xml.sax软件包提供了许多模块 用于实现Python的Simple API for XML SAX 接口包本 ...
  • sax-machine, 由Nokogiri支持的声明性sax解析库 SAX机器状态 描述由 Nokogiri 。Ox或者Oga支持的声明性SAX解析库。安装将此行添加到你的应用程序的Gemfile中:gem 'sax-machine'然后执行:$ bund
  • pull sax_提示,异步SAX

    2020-06-20 09:46:25
    尽管对SAX的每个抽象描述都突出地提到了它是事件驱动的接口,但很少有SAX应用程序真正使用 SAX进行事件驱动的编程。 相反,SAX主要只是在从XML文档提取数据时节省内存的一种方法。 但是,在异步通道上(例如长时间...
  • 本文原文连接:...有时候你会发现过去一直启动正常的系统,某天启动时会报出形如下面的错误:org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www
  • 2017/3/12 20.11 xml.sax.saxutils SAX实用程序 Python 3.6.1rc1文档 20.11xml.sax.saxutils SAX工具 源代码 Lib / xml / sax / saxutils.py 该模块xml.sax.saxutils包含许多类和函数 这些类和函数在创建SAX应用程序...
  • sax解析

    2017-02-03 11:55:57
    simple api for java ...首先要编写SAX解析器,继承default Handler 覆盖父类的方法package sax;import org.xml.sax.*; import org.xml.sax.helpers.*;public class MySAX extends DefaultHandler { public void sta

空空如也

1 2 3 4 5 ... 20
收藏数 17,445
精华内容 6,978
关键字:

sax