• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

因为某些原因受这种限制),这种情况可能直到程序成功运行几个月后都不会发生。注意这种问
题。
有一种情况解析器必须分解文本,就是当使用外部实体的时候。S A X规范明确规定一个
character( )调用不能包含来自两个不同外部实体的文本。
如果想直接对字符数据操作而不是简单地无条件地复制它到输出文件,你也许会对其所属
哪个元素感兴趣。然而S A X接口不会直接提供这种信息。如果需要这种上下文信息,你的应用
程序必须维护一个数据结构,它保留以前事件的一些内存映像。最常见的是堆栈。在下一节会
说明如何使用一些简单的数据结构,既能组合解析器提供的字符数据片段,又可以确定它所属
的元素。
这是第二种报告字符数据的方法,即:
• ignorableWhitespace(char[] chars, int start, int len)
这个接口可以告知S A X规范泛指的“可忽略空白”。如果D T D用“元素内容”定义了一个元
素(也就是说元素可以有子元素,但不能包含P C D ATA),那么即使“真正”的字符数据是不允
许的, X M L也可以用空格、制表符和换行分割开子元素。这种空白很可能是无关紧要的,所以
一个S A X应用程序几乎总是忽略它:你可以仅仅通过使用一个空操作的i g n o r a b l e W h i t e s p a c e ( )方
法实现。只有当你的应用程序把输入数据不加改变地复制到输出时,你才有可能想做一些其他
操作。
然而X M L规范允许一个解析器忽略外部DTD 中的信息。非确认解析器不需要辨别包含元素
第6章SAX 1.0: XML简易API使用155 下载
内容的元素和包含混合内容的元素。在这种情况下,可忽略空白可以通过一般的characters( )接
口被告知。
不幸的是无法在一个S A X应用程序中判断解析器是否是确认型的,所以一个可移植的应用
程序必须考虑到这两种情况。这也是S A X的一个局限性,但是在SAX 2.0里得到了修正。
(4) 处理指令
解析器还报告一种被称为处理指令的元素。你很可能不会经常地遇到处理指令:它们是可
能出现在X M L文档中“< ?”“? >”之间任何位置的指令。一个处理指令有一个名称(即目标)和
任意特征数据(目标应用程序有关的指令)。
处理指令通过下面的方法通知给D o c u m e n t H a n d l e r:
• processingInstruction(String name, String data)
按照约定,应该忽略所有的处理指令(或者不加改变地复制它),除非可以识别处理指令的
名称。
在文档开始的X M L声明可能像是一个处理指令,但是它不是一个真正的处理指令,并且
不会通过上述接口告知应用程序—实际上是什么也不告知。
处理指令经常被写成像元素开始标签的形式,包含一连串k e y w o r d = " v a l u e "属性。然而这种
语法对一个应用程序约定是完备的,而不在X M L标准中定义。所以S A X不能识别它;处理指令
数据的内容被当作乱七八糟的东西被忽略掉。
4. 错误处理
到目前为止我们掩饰了对错误的处理,但是在一个真正的生产性应用程序中,错误处理总
是需要认真考虑的。
主要有三种错误可能出现:
• 不能打开X M L输入文件或者它引用的另一个文件,例如D T D或另一个外部实体。在这种
情况下,解析器就会产生一个I O E x c e p t i o n(输入/输出异常)而由应用程序处理它。
• 解析器检测到的X M L错误,包括规范化错误和合法性错误。可以通过调用应用程序提供的
错误处理器进行错误处理,如下面所述。
• 应用程序检测到的错误:例如属性中不完整的日期或数字。可以通过在检测到错误的
D o c u m e n t H a n d l e r方法中产生一个例外进行错误处理。
(1) 处理X M L错误
根据X M L标准自身用到的术语, S A X规范对错误严重程度定义了三个级别(参见表6 - 2)。
表6 - 2
错误描述
致命错误通常表示X M L格式不正确。如果存在注册的错误处理器,解析器
就会调用它;反之解析器产生一个S A X P a r s e E x c e p t i o n。大多数情
况下,解析器发现第一个致命错误后就会终止运行
错误通常表示X M L格式正确但不合法有效。如果存在注册的错误处理
器,解析器就会调用它;反之解析器将忽略错误
156使用XML 高级编程
下载
(续)
错误描述
警告表示X M L是正确的,但是解析器认为报告一些情况是有用的。例
如可能是一个“交互操作”规则的冲突:输入是正确的X M L但不是
正确的S G M L。如果存在注册的错误处理器,解析器就会调用
它;反之解析器将忽略错误
应用程序可以通过解析器的setErrorHandler( )方法注册一个错误处理器。错误处理器包含三
个方法,fatalError( ),error( )和warning( ),分别对应三种级别的错误。如果不想定义全部三种
方法,你可以创建一个从H a n d l e r B a s e继承而来的错误处理器:它包含所有三种方法的样式,但
所做的操作和没有注册错误处理器相同。
在所有三种情况下,错误处理器方法的参数是一个S A X P a r s e E x c e p t i o n对象。你可能认为当
错误发生时产生并处理的是J a v a例外;但是实际上例外是一个正规的J a v a对象,可以像其他J a v a
对象一样作为一个参数传递给方法:也可能根本不会被产生。S A X P a r s e E x c e p t i o n包含错误的有
关信息,如它在X M L源文件中何处出现。错误处理器方法最常见的操作是抽取这些信息以生成
一个错误消息,错误消息可以被写到适当的目标文件:例如一个We b服务器日志文件。
错误处理器方法还可以产生异常:异常经常被当做参数由解析器提供,但不是必须这样。
如果异常产生了,解析一般会被终止,并且高层的应用程序会看到由parse( )方法产生的相同的
异常。这是另一个输出诊断消息的时机。是从错误处理器里生成一个致命错误消息还是让高层
应用程序捕获异常,这完全由你决定。
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(60)