您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > XML基础教程(第2版)_第5章_SAX解析器
2020/2/61本章主要内容2020/2/62概述DOM解析器的好处是:一个应用程可以方便地操作内存中树的节点来处理XML文档,获取自己所需要的数据。但DOM解析器也有不足之处,如果XML文件较大,相应的Document对象就要占用较多的内存空间,另外,应用程序可能并不需要XML文件的全部数据,而只是需要一部分,但为了获取这一部分数据却付出了较大的空间代价。和DOM解析器不同的是,SAX解析器不在内存中建立和XML文件相对应的树形结构数据,SAX解析器的核心是事件处理机制,和DOM解析器相比,SAX解析器占有的内存少,对于许多应用程序,使用SAX解析器来获取XML数据具有较高的效率。2020/2/63§5.1初识SAX解析器§5.1.1SAX解析器及工作原理SAX解析器的核心是事件处理机制,SAX解析器调用parse(Filef,DefaultHandlerdh)解析XML文件,并向该方法的参数dh传递一个事件处理器。SAX解析器在解析XML文件的过程中,根据从文件中解析出的的数据产生相应的事件,并报告这个事件个给事件处理器,事件处理器就会处理所发现的数据,parse方法必须等待事件处理器处理完毕后再继续解析文件,报告下一个事件。2020/2/64§5.1.2创建SAX解析器的步骤与事件处理_1(1)实例化一个SAXParserFactory对象:SAXParserFactoryfactory=SAXParserFactory.newInstance();(2)返回一个SAXParser对象(称做SAX解析器):SAXParsersaxParser=factory.newSAXParser();1.创建SAX解析器的步骤2.事件处理器SAX解析器使用下述parse()方法解析XML文件:◆publicvoidparse(Filef,DefaultHandlerdh)◆publicvoidparse(InputStreamis,DefaultHandlerdh)◆publicvoidparse(Stringuri,DefaultHandlerdh)2020/2/65§5.1.2创建SAX解析器的步骤与事件处理_2SAX解析器的核心是事件处理机制,当SAX解析器调用parse方法解析XML文件时,事件处理器会根据所产生的事件调用相应的方法来处理发现的数据。在编写程序时,需要使用DefaultHandler类的子类创建一个事件处理器。3.事件的产生与处理2020/2/66例子1example5_1.xml?xmlversion=1.0encoding=UTF-8?雇员列表雇员姓名张小三/姓名性别男/性别/雇员/雇员列表SAXOne.java2020/2/67表5.1事件的产生与处理2020/2/685.2文件的开始与结束当解析器开始解析器XML文件时,就会报告“文件开始”事件给事件处理器,然后再陆续地报告其它的事件,比如“开始标记”、“文本事件”等,最后报告“文件结束”事件。解析器报告“文件开始”事件,事件处理器就会调用startDocument()方法;解析器报告“文件结束”事件,事件处理器就会调用endDocument()方法。解析器在解析器XML文件的过程中只能报告一次“文件开始”事件和“文件结束”事件”。2020/2/69例子2example5_2.xml?xmlversion=1.0encoding=UTF-8?图书信息图书名称XML基础教程(第2版)/名称价钱26元/价钱/图书图书名称JSP基础教程(第二版)/名称价钱28元/价钱/图书/图书信息SAXTwo.java2020/2/6105.3标记开始与结束事件当解析器发现一个标记的开始标记时,就将所发现的数据封装为一个“开始标记”事件,并报告该事件给事件处理器,事件处理器就会知道所发生的事件,然后调用startElement(Stringuri,StringlocalName,StringqName,,Attributesatts)方法对发现的数据做出处理,方法中的参数atts是解析器发现的标记的全部属性。对同一个非空标记,解析器报告完该标记的“标记开始”事件后,一定还会报告该标记的“标记结束”事件,事件处理器就会知道所发生的事件,然后调用endElement(Stringuri,StringlocalName,StringqName)方法对发现的数据做出处理。如果一个标记是空标记,解析器也报告“标记开始”事件和“标记结束”事件,即解析器将名字为“nullName”的空标记按不包含任何字符的非空标记:nullName/nullName来处理。2020/2/611例子3example5_3.xml?xmlversion=1.0encoding=UTF-8?首都列表中国xmlns:ch=Chinach:首都区号=86北京/ch:首都/中国美国xmlns:US=UnitedStatesUS:首都区号=01华盛顿/US:首都/美国南极//首都列表SAXThree.java2020/2/6125.4文本事件XML文件中标记的内容中可以有文本数据,当解析器解析这些数据时,就报告“文本”事件给处理器,,事件处理器就会知道所发生的事件,然后调用publicvoidcharacters(char[]ch,intstart,intlength)方法对解析的数据做出处理,参数字符数组ch中存放的就是解析器解析的文本数据、start是数组ch中存放字符的起始位置,length是存放的字符的个数。2020/2/613例子4example5_4.xml?xmlversion=1.0encoding=UTF-8?应聘者简历应聘者姓名张三/姓名毕业学校清华大学/毕业学校/应聘者应聘者姓名李四/姓名毕业学校北京大学/毕业学校/应聘者/应聘者简历SAXFour.java2020/2/614例子5example5_5.xml?xmlversion=1.0encoding=UTF-8?成绩单学生姓名张三/姓名数学成绩89/数学成绩英语成绩77/英语成绩/学生学生姓名李四/姓名数学成绩92/数学成绩英语成绩65/英语成绩/学生/成绩单SAXFive.java2020/2/6155.5名称空间事件当解析器在一个标记的开始标记中发现一个名称空间声明时,就先报告一个“名称空间开始”事件给事件处理器,然后再报告“开始标记”事件。解析器报告“名称空间开始”事件后,处理器就会知道所发生的事件,然后调用publicvoidstartPrefixMapping(Stringprefix,Stringuri)方法对发现的数据做出处理,方法中的参数prefix是解析器发现的名称空间的前缀,uri是名称空间的名称,如果名称空间没有前缀,prefix是不含任何字符的串,即prefix=。2020/2/616例子6example5_6.xml?xmlversion=1.0encoding=UTF-8?图书列表xmlns:清华=清华大学出版社xmlns:机工=机械工业出版社清华:图书清华:书名Java程序设计/清华:书名清华:书名JSP程序设计/清华:书名/清华:图书机工:图书机工:书名Java程序设计/机工:书名机工:书名JSP程序设计/机工:书名/机工:图书/图书列表SAXSix.java2020/2/6175.6错误事件SAX解析器默认地检查XML文件是否是规范的,如果想让SAX解析器检查XML文件是否是有效的,SAXParserFactory对象factory事先必须进行如下的设置:factory.setValidating(true);SAX解析器在解析XML文件的过程中,如果发现错误就会报告一个“错误”事件给解析器,报告的信息是一个SAXParseException对象,事件处理器就会调用下列某个方法来处理信息:publicvoidwarning(SAXParseExceptione)throwsSAXExceptionpublicvoiderror(SAXParseExceptione)throwsSAXExceptionpublicvoidfatalError(SAXParseExceptione)throwsSAXException上述三个方法中的参数e就是解析器报告的SAXParseException对象2020/2/618错误的分类当解析器报告一个“错误”事件后,事件处理器会根据错误的类型调用三个方法中的某一个,现在分别阐述如下。1.warning(警告)警告不属于规范性错误。当解析器认为有必要发出一个警告信息时,就报告一个“警告”事件给解析器,报告的信息是一个SAXParseException异常对象,事件处理器就会调用waring方法。2020/2/6192.error(一般错误)错误是非致命的。解析器认为这样的一般错误不会影响它继续解析文件,例如,当设置解析器检查XML文件的有效性时,解析器就会检查XML文件是否遵守了DTD文件所规定的约束,如果发现XML文件未遵守某个约束就会报告一个“一般错误”事件给解析器,报告的信息是一个SAXParseException异常对象。处理器调用error方法时,一般不必抛出SAXException异常,因为这些错误不会影响解析器继续解析文件。2020/2/6203.fatalError(致命错误)错误是致命错误。解析器认为这样的错误会影响它继续解析文件,因为这些错误导致继续解析XML文件要么是完全浪费时间,要么是无法继续解析文件。例如,XML文件不满足规范性或关联的DTD文件有错误等都会导致致命错误。所以,处理器调用fatalError方法时,应当抛出SAXException异常,停止解析过程。如果不抛出SAXException异常,让解析器继续解析文件,但解析器发现自己已经无法继续解析文件,那么解析器就会强制停止parse方法的执行。2020/2/621例子7example5_7.xml?xmlversion=1.0encoding=UTF-8?!DOCTYPE商品信息SYSTEMsevenDTD.dtd商品信息商品名称电视机/名称生产日期2010-12-20/生产日期价格5676元/台/价格/商品商品名称洗衣机/名称价格6686元/台/价格生产日期2009-10-19/生产日期/商品/商品信息SAXSeven.javasevenDTD.dtd!ELEMENT商品信息(商品*)!ELEMENT商品(名称,生产日期,价格)!ELEMENT名称(#PCDATA)!ELEMENT生产日期(#PCDATA)!ELEMENT价格(#PCDATA)2020/2/622例子7_运行效果2020/2/6235.7处理空白标记之间的缩进区域都是为了使得XML文件看起来更美观很形成的,但解析器并不知道这一点,所以解析器仍然认为它们是有用的文本数据(由空白类字符组成)。人们习惯上称标记之间的缩进区是可忽略空白,这实际上不是很准确,因为XML文件的标记可以有文本和子标记(混合内容),在这种情况下,标记之间的区域中就可能包含非空白的字符内容。我们可能不希望事件处理器去调用characters方法来处理标记之间的缩进区域形成的这些空白字符,因为这样会延时事件处理器获取其它数据的时间。如果不想让事件处理器去调用characters方法来处理这些空白字符,那么XML文件必须是有效的,而且所关联的DTD文件必须规定XML文件的标记不能有混合内容。一
本文标题:XML基础教程(第2版)_第5章_SAX解析器
链接地址:https://www.777doc.com/doc-3528497 .html