8.10.1 ContentHandler 对象
使用者通常被期望细分ContentHandler的功能来支持他们的应用。下面的方法就是被解析器调用来处理那些输入文件中相应的事件的。
setDocumentLocator(locator)
被解析器调用,赋予应用程序一个定位器(locator)来定位原始文件事件。
SAX解析器大力鼓励(但不是绝对需要)提供一个定位器:如果它这样做,
它必须首先通过调用这个方法来为应用 提供一个定位器,调用此方法必
须在任何DocumentHandler接口中的其他方法之前。
定位器允许应用程序来决定任何文件事件的尾部,即使分析器不报告的错误。
典型的,应用程序将会用到这个信息老报告自己的错误(比如字符内容和应
用程序的业务规则不匹配)这些由定时器返回的信息很可能没有充足的理由
来使用搜索引擎。
请注意,定位将返回正确的信息仅仅在接口相关的事件发生的时候。
应用程序不应该试图在其他任何时间利用它。
startDocument()
接收一个文件开始的通知。
SAX解析器将只会调用这个方法一次,在此接口或者在DTDHandler
(此时需要setDocumentLocator)的任何其他方法之前。
endDocument()
接收文件结束的通知
SAX解析器将会仅调用这个方法一次,而且这将是解析器调用的最后
一个方法。如解析器已经放弃解析(会出现一个不可恢复的错误)或
者达到了输入的末尾时解析器不能调用这个方法。
startPrefixMapping(prefix,uri)
开始prefix-URI 名字空间匹配
来自于这个事件的信息对于普通的名字空间的处理来说不是必需的:
当feature_namespaces特性被激活时SAX XML阅读器将会自动的为元素替换前缀和属性名字。
在有些情况下,然而,当应用程序需要在数据或属性值里面使用前缀字符时,
他们不能安全地自动扩展;startPrefixMapping()和endPrefixMapping()事件
提供了这方面的应用,如果有必要的话,可以利用他们来扩展前缀。
请注意, startPrefixMapping()和endPrefixMapping()
事件不能保证得到妥善的嵌套对:所有startPrefixMapping()
事件将会发生在相应的startElement()事件之前,,以及所有endPrefixMapping()
事件将会发生在相应的endElement()事件后,但他们的秩序是无法得到保证的。
endPrefixMapping(prefix)
结束prefix-URI匹配
请参考startPrefixMapping()
这个事件总是在相应的endElement()事件发生之后发生,并且endPrefixMapping()事件
发生的顺序是没有得到保证的。
startElement(name,attrs)
标志一个无名字空间模式元素的开始。
name参数包含原始XML 1.0的名称元素类型
name是字符串类型,参数attrs持有一个包含元素属性的接口对象。
通过attrs传递的对象可能会被解析器重用(reuse)。
持有一份对象的引用不是一个得到一个属性拷贝可靠的方法。
通过使用attrs对象的copy()方法可以得到一份属性的拷贝。
endElement()
标志一个无名字空间模式元素的结束。
name参数包括元素类型的名字,和startElement()事件相同。
startElementNS(name,qname,attrs)
标志一个名字空间模式下的元素的开始。
name参数是一个包含元素类型属性的tuple类型(e.g.(uri,localname)),
qname参数包含在源文件里面使用的原始XML1.0的名字,
attrs参数持有一份包含元素属性的AttrbutesNS接口实例。
如果没有名字空间和本元素关联,那么uri组件名将会为None。
持有一份对象的引用不是一个得到一个属性拷贝可靠的方法。
通过使用attrs对象的copy()方法可以得到一份属性的拷贝。
endElementNS()
标志一个名字空间模式下的元素的结束。
name参数包括元素类型的名字,和startElementNS()事件相同,qname参数也同样是这样的。
characters(content)
接受字符数据标志
解析器会调用这个方法来报告每个大块的字符数据。SAX解析器
可能在一个数据块里面返回所有的边界字符数据,或者他们会把它
切分成几块,无论如何,任何一个事件里面的所有的字符都必须
来自相同的外部实体以保证定位器能提供有用的信息。
content可以是一个Unicode字符串也可以是一个byte字符串。
expat阅读器模块总是会产生Unicode字符串。
注:早期的SAX 1接口是由PYthon XML Special Interest Group通过
一个很像Java接口的方法提供的。
ignorableWhitespace(whitespace)
接受元素内容里的可忽略的空白符的标志符。
确认解析器的时候必然会用到这个方法来报告每个数据块可忽略的空白符
(参考W3C XML 1.0 recommendation,2.10):不需要确认的解析器也可以使用
这个方法如果他们还能用来解析或者使用他们的content模块。
SAX解析器可能在一个数据块里面返回所有的可忽略空白符,或者他们会把它
切分成几块,无论如何,任何一个事件里面的所有的可忽略空白符都必须
来自相同的外部实体以保证定位器能提供有用的信息。
processingInstruction(target,data)
接受处理说明的标志。
解析器会调用为每一个找到的处理说明调用一次这个方法:
需要注意的是处理说明可能出现在主文件元素的前面或者后面。
一个SAX解析器应该永远不能通过这个方法报告一个XML声明(XML 1.0,2.8)或者一个文本
声明(XML 1.0,4.3.1)。
skippedEntity(name)
接收一个被浏跳过的实体的标志。
解析器会为每个被跳过的实体调用一次这个方法。
不需要确认的处理(processor)可能会跳过实体如果他没有看见声明的话
(因为,比如说,这个实体实在外部的DTD子集里面声明的)
所有的处理可能跳过外部实体,这取决于feature_external_ges和the
feature_external_pes的属性值。
[url=http://bugway.cn]BlackBall[/url]翻译,拙劣之处请不吝赐教。E-mail: [email=bugway@gmail.com]bugway@gmail.com[/email]
页:
[1]