您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > SAX解析XML文档.
SAX解析XML文档学习目标掌握SAX的概念和特点理解SAX的工作机制了解SAX的常用接口熟练掌握SAX解析XML文档的步骤熟练掌握解析器和事件处理器的创建和使用SAX简介SAX没有官方的标准机构,它不属于任何标准组织或团体,也不属于任何公司或个人,而是供任何人使用的一种计算机技术。SAX是XML事实上的标准,所有的XML解析器都支持它,已经被Java,C#等语言编写实现SAX是一种基于事件的APISAX概述SAX是SimpleAPIforXML,简易应用程序编写接口。解析的核心是事件处理机制,具有占用内存少,效率高等特点。SAX是一种高效的解析器,在对那些要处理大量数据的应用程序,这种特性尤为重要。它允许在读取文档时处理它,而不必等到整个文档都被存储之后才采用该操作。SAX的工作机制【重点掌握】SAX在概念上与DOM完全不同。它采用事件机制的方式来解析XML文档。使用SAX解析器对XML文档进行解析时,会触发一系列事件,这些事件将被相应的事件监听器监听,从而触发相应的事件处理方法,应用程序通过这些事件处理方法实现对XML文档的访问。Java事件处理图事件事件源事件监听器外部动作1.将事件监听器注册到事件源2触发事件源上事件3.生成事件对象4.触发事件监听器事件被作为参数传入事件处理器事件处理器事件处理器….5.调用事件处理器做响应SAX解析器调用处理器方法DTD(可选)XML源startDocumentstartElmentcharatersendElmentendDocumentEtc….输出SAX解析器根本不创建任何对象,它只是在遇到XML文档的各种标签时触发对应的事件,并将XML元素的内容封装成事件传出去。而程序员则负责提供事件监听器来监听这些事件,并通过事件获取XML文档信息。SAX解析器在解析开始的时候就开始发送事件,当解析器开始处理文档开始,元素开始和文本时,负责在文档中触发一个事件,而程序员则实现这些事件监听器,这些监听器负责处理这些事件——事件中包含了XML元素的内容。可以这样理解SAX的解析过程:SAX解析器就像一个电子探测器,它在XML文档中一路走过来,每经过一个元素开始、元素结束、处理指令开始、处理指令结束…..都将向外发送一个事件,给元素的内容就包含在该事件中,而程序则负责接收该事件,并将其内容解析出来。SAX监听器【重点掌握】SAX解析事件一共有4种,因此需要分别设置4种监听器。ContentHandler:监听XML文档内容处理事件的监听器DTDHander:监听DTD处理事件的监听器EntityResolver:监听实体处理事件的监听器ErrorHandler:监听解析错误的监听器在ContentHandler接口中定义了如下方法:voidcharacters(char[]ch,intstart,intlength):SAX解析器处理字符数据时触发该方法voidendDocument():SAX解析器处理文档结束时触发该方法voidendElement(Stringuri,StringlocalName,StringqName):SAX解析器处理元素结束时触发该方法voidendPrefixMapping(Stringprefix):SAX解析器处理元素里命名空间属性(即xmlns:prefix属性)结束时触发该方法voidignorableWhitesapce(char[]ch,intstart,intlength):SAX解析器处理元素内容中可忽略的空白时触发该方法voidskippedEntity(Stringname):SAX解析器跳过实体时触发该方法voidstartDocument():SAX解析器开始处理文档时触发该方法voidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts):SAX解析器开始处理元素时触发该方法voidstartPrefixMapping(Stringprefix,Stringuri):SAX解析器开始处理元素里命名空间属性(即xmlns:prefix属性)时触发该方法SAX解析XML文档?xmlversion=1.0encoding=GB2312?员工名单员工姓名黄胜霞/姓名岗位前台接待/岗位/员工/员工名单1发现XML文件,触发文件开始事件,监听器调用startDocument()方法处理2发现“员工名单”的开始标记,触发开始标记事件,监听器调用startElement()方法处理3发现员工名单和员工之间的空白符号,触发文本事件,监听器调用characters方法处理4发现“员工”的开始标记,触发开始标记事件,监听器调用startElement()方法处理5发现员工和姓名之间的空白符号,触发文本事件,监听器调用characters方法处理6发现“姓名”的开始标记,触发开始标记事件,监听器调用startElement()方法处理7发现姓名标记的文本内容,触发文本事件,监听器调用characters方法处理8发现“姓名”标记的结束标记,触发结束标记事件,监听器调用endElement()方法处理…………17发现XML文件结束,触发文件结束事件,调用endDocument()方法SAX解析器【重点掌握】JAVA为SAX解析器提供了如下2组API:XMLReader和XMLReaderFactoryXMLReaderFactory工厂类createXMLReader()静态方法用于创建XMLReader。这两个类位于org.xml.sax包下。SAXParser和SAXParserFactorySAXParserFactory工厂类的newSAXParser()实例方法用于创建SAXParser。这两个类位于javax.xml.parsers包下。XMLReader定义了以下两种用于解析XML文档的方法:voidparse(InputSourceinput):解析InputSource输入源中的XML文档voidparse(StringsystemId):解析系统URI所代表的XML文档SAXParser定义了以下几种用于解析XML文档的方法:voidparse(Filef,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析f文件所代表的XML文档voidparse(InputSourceis,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析is输入源的XML文档voidparse(InputStreamis,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析is输入流的XML文档voidparse(Stringuri,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析系统URI所代表的XML文档提问:为何XMLReader在调用时不需要传入SAX解析时间的监听器呢?SAX解析不是总是基于事件机制的吗?回答:的确是这样。因此使用XMLReader解析XML文档时一样需要制定监听器来监听事件。只不过XMLReader不通过parse()方法临时指定监听器。通过自己本身的setContentHandler(ContentHandlerhandler),setDTDHandler(DTDHandlerhandler),setEntityResolverHandler(EntityResolverresolver),setErrorHandler(ErrorHandlehandler),4个方法来设置监听器。也就是说,在调用XMLReader的parse()方法来解析XML文档之前,应先调用上面4个方法设置监听SAX解析事件的监听器。如果使用XMLReader去解析XML文档,程序员需要分别为上面四个监听器提供实现类,然后调用XMLReader的setXXXHandler()方法来注册监听器,这是一件麻烦的事情。幸好JAVA提供了一个DefaultHandler类来解决这个问题,这个类实现了四个监听器接口,并为这些接口中所包含的方法提供了空实现。它通常用于被继承,我们只需要重写我们所关心的监听方法,而无须为每个方法都提供实现。SAX应用利用SAX解析XML文档,涉及两个部分:解析器和事件监听器。解析器负责读取XML文档中“行走”,每当遇到文档开始、元素开始、文本、元素结束和文档结束时,都将负责向外发送事件。程序员则负责提供事件监听器来监听这些事情,并通过事件获取XML文档信息。SAX解析器的创建及调用【重点掌握】使用javax.xml.parsers包中SAXParserFactory类调用方法newInstance实例化一个解析器工厂对象.代码如下:Factory对象调用newSAXParser()方法,创建一个SAXParser对象,也可以称为SAX解析器解析器创建完成后,就调用parse()方法解析XML文件.SAXParserFactoryfactory=SAXParserFactory.newInstance();SAXParsersaxParser=factory.newSAXParser();Publicvoidparse(Filef,DefaultHandlerdh)throwsSAXEception,IOException处理文件开始和结束当SAX解析器解析XML文档时,解析到不同的标记时会触发不同的事件。当解析到文档开始和文档结束时,就会分别出发startDocument()和endDocument()方法。如果要实现处理“文件开始”和“文件结束”事件,需要在程序的类中重写这两个继承的方法。classMyHandlerextendsDefaultHandler{Filefile;longstarttime,endtime;publicMyHandler(Filef){file=f;}publicvoidstartDocument(){starttime=System.currentTimeMillis();System.out.println(文件所在的路径是+file.getAbsolutePath());System.out.println(文件名为+file.getName());System.out.println(开始解析XML文件----------);}publicvoidendDocument(){System.out.println(解析XML文件结束----------);endtime=System.currentTimeMillis();System.out.println(文件解析共花费+(endtime-starttime)+秒);}}监听器编程部分:继承DefaultHandler监听器,并重写其部分方法构造函数程序员自己开发的监听器为MyHandler,它必须继承JAXP提供的DefaultHandler监听器接口,并重写其部分方法重写文档开始方法的内容。当文档开始事件触发的时候,就调用这个方法对其进行处理重写文档结束方法的内容。当文档结束事件触发的时候,就调用这个方法对其进行处理SAX解析器部分SAXParserFactoryfactory=SAXParserFactory.newInstance();SAXParsersaxParser=factory.newSAXParser();Filefile=newFile(Example2.xml);MyHandlerhandler=newMyHandler(file);saxParser.parse(file,handler);调用实现DefaultHandler监听器接口类的构造函数将XML文档和监听器作为参数传入到
本文标题:SAX解析XML文档.
链接地址:https://www.777doc.com/doc-2857254 .html