20.12. "xml.sax.xmlreader" --- 用于 XML 解析器的接口
****************************************************

**源代码:** Lib/xml/sax/xmlreader.py

======================================================================

SAX 解析器实现了 "XMLReader" 接口。 它们是在一个 Python 模块中实现的，
该模块必须提供一个 "create_parser()" 函数。 该函数由
"xml.sax.make_parser()" 不带参数地发起调用来创建新的解析器对象。

class xml.sax.xmlreader.XMLReader

   可由 SAX 解析器继承的基类。

class xml.sax.xmlreader.IncrementalParser

   在某些情况下，最好不要一次性地解析输入源，而是在可用的时候分块送入
   。 请注意读取器通常不会读取整个文件，它同样也是分块读取的； 并且
   "parse()" 在处理完整个文档之前不会返回。 所以如果不希望 "parse()"
   出现阻塞行为则应当使用这些接口。

   当解析器被实例化时它已准备好立即开始接受来自 feed 方法的数据。 在通
   过调用 close 方法结束解析时 reset 方法也必须被调用以使解析器准备好
   接受新的数据，无论它是来自于 feed 还是使用 parse 方法。

   请注意这些方法 *不可* 在解析期间被调用，即在 parse 被调用之后及其返
   回之前。

   默认情况下，该类还使用 IncrementalParser 接口的 feed, close 和
   reset 方法来实现 XMLReader 接口的 parse 方法以方便 SAX 2.0 驱动的编
   写者。

class xml.sax.xmlreader.Locator

   用于关联一个 SAX 事件与一个文档位置的接口。 定位器对象只有在调用
   DocumentHandler 的方法期间才会返回有效的结果；在其他任何时候，结果
   都是不可预测的。 如果信息不可用，这些方法可能返回 "None"。

class xml.sax.xmlreader.InputSource(system_id=None)

   "XMLReader" 读取实体所需信息的封装。

   这个类可能包括了关于公有标识符、系统标识符、字节流（可能带有字符编
   码格式信息）和/或一个实体的字符流的信息。

   应用程序将创建这个类的对象以便在 "XMLReader.parse()" 方法中使用或是
   用于从 EntityResolver.resolveEntity 返回值。

   "InputSource" 属于应用程序，"XMLReader" 不能修改从应用程序传递给它
   的 "InputSource" 对象，但它可以创建副本并进行修改。

class xml.sax.xmlreader.AttributesImpl(attrs)

   这是 "Attributes" 接口（参见 Attributes 接口 一节）的具体实现。 这
   是一个 "startElement()" 调用中的元素属性的字典类对象。 除了最有用处
   的字典操作，它还支持接口所描述的一些其他方法。 该类的对象应当由读取
   器来实例化；*attrs* 必须为包含从属性名到属性值的映射的字典类对象。

class xml.sax.xmlreader.AttributesNSImpl(attrs, qnames)

   可感知命名空间的 "AttributesImpl" 变体形式，它将被传递给
   "startElementNS()"。 它派生自 "AttributesImpl"，但会将属性名称解读
   为 *namespaceURI* 和 *localname* 二元组。 此外，它还提供了一些期望
   接收在原始文档中出现的限定名称的方法。 这个类实现了 "AttributesNS"
   接口（参见 AttributesNS 接口 一节）。


20.12.1. XMLReader 对象
=======================

"XMLReader" 接口支持下列方法:

XMLReader.parse(source)

   Process an input source, producing SAX events. The *source* object
   can be a system identifier (a string identifying the input source
   -- typically a file name or a URL), a file-like object, or an
   "InputSource" object. When "parse()" returns, the input is
   completely processed, and the parser object can be discarded or
   reset.

   在 3.5 版更改: 添加了对字符流的支持。

XMLReader.getContentHandler()

   返回当前的 "ContentHandler"。

XMLReader.setContentHandler(handler)

   设置当前的 "ContentHandler"。 如果没有设置 "ContentHandler"，内容事
   件将被丢弃。

XMLReader.getDTDHandler()

   返回当前的 "DTDHandler"。

XMLReader.setDTDHandler(handler)

   设置当前的 "DTDHandler"。 如果没有设置 "DTDHandler"，DTD 事件将被德
   育。

XMLReader.getEntityResolver()

   返回当前的 "EntityResolver"。

XMLReader.setEntityResolver(handler)

   设置当前的 "EntityResolver"。 如果没有设置 "EntityResolver"，尝试解
   析一个外部实体将导致打开该实体的系统标识符，并且如果它不可用则操作
   将失败。

XMLReader.getErrorHandler()

   返回当前的 "ErrorHandler"。

XMLReader.setErrorHandler(handler)

   设置当前的错误处理句柄。 如果没有设置 "ErrorHandler"，错误将作为异
   常被引发，并将打印警告信息。

XMLReader.setLocale(locale)

   允许应用程序为错误和警告设置语言区域。

   SAX 解析器不要求为错误和警告提供本地化信息；但是如果它们无法支持所
   请求的语言区域，则必须引发一个 SAX 异常。 应用程序可以在解析的中途
   请求更改语言区域。

XMLReader.getFeature(featurename)

   返回 *featurename* 特性的当前设置。 如果特性无法被识别，则会引发
   "SAXNotRecognizedException"。 在 "xml.sax.handler" 模块中列出了常见
   的特性名称。

XMLReader.setFeature(featurename, value)

   将 *featurename* 设为 *value*。 如果特性无法被识别，则会引发
   "SAXNotRecognizedException"。 如果特性或其设置不被解析器所支持，则
   会引发 *SAXNotSupportedException*。

XMLReader.getProperty(propertyname)

   返回 *propertyname* 属性的当前设置。 如果属性无法被识别，则会引发
   "SAXNotRecognizedException"。 在 "xml.sax.handler" 模块中列出了常见
   的属性名称。

XMLReader.setProperty(propertyname, value)

   将 *propertyname* 设为 *value*。 如果属性无法被识别，则会引发
   "SAXNotRecognizedException"。 如果属性或其设置不被解析器所支持，则
   会引发 *SAXNotSupportedException*。


20.12.2. IncrementalParser 对象
===============================

"IncrementalParser" 的实例额外提供了下列方法:

IncrementalParser.feed(data)

   处理 *data* 的一个分块。

IncrementalParser.close()

   确定文档的结尾。 这将检查只能在结尾处检查的格式是否良好的条件，发起
   调用处理程序，并可能会清理在解析期间分配的资源。

IncrementalParser.reset()

   此方法会在调用 close 来重置解析器以便其准备好解析新的文档之后被调用
   。 在 close 之后未调用 reset 即调用 parse 或 feed 的结果是未定义的
   。


20.12.3. Locator 对象
=====================

"Locator" 的实例提供了下列方法:

Locator.getColumnNumber()

   返回当前事件开始位置的列号。

Locator.getLineNumber()

   返回当前事件开始位置的行号。

Locator.getPublicId()

   返回当前事件的公有标识符。

Locator.getSystemId()

   返回当前事件的系统标识符。


20.12.4. InputSource 对象
=========================

InputSource.setPublicId(id)

   设置该 "InputSource" 的公有标识符。

InputSource.getPublicId()

   返回此 "InputSource" 的公有标识符。

InputSource.setSystemId(id)

   设置此 "InputSource" 的系统标识符。

InputSource.getSystemId()

   返回此 "InputSource" 的系统标识符。

InputSource.setEncoding(encoding)

   设置此 "InputSource" 的字符编码格式。

   编码格式必须是 XML 编码声明可接受的字符串（参见 XML 建议规范第
   4.3.3 节）。

   如果 "InputSource" 还包含一个字符流则 "InputSource" 的 encoding 属
   性会被忽略。

InputSource.getEncoding()

   获取此 InputSource 的字符编码格式。

InputSource.setByteStream(bytefile)

   设置此输入源的字节流（为 *binary file* 对象）。

   如果还指定了一个字符流被则 SAX 解析器会忽略此设置，但它将优先使用字
   节流而不是自己打开一个 URI 连接。

   如果应用程序知道字节流的字符编码格式，它应当使用 setEncoding 方法来
   设置它。

InputSource.getByteStream()

   获取此输入源的字节流。

   getEncoding 方法将返回该字节流的字符编码格式，如果未知则返回 "None"
   。

InputSource.setCharacterStream(charfile)

   设置此输入源的字符流 (为 *text file* 对象)。

   如果指定了一个字符流，SAX 解析器将忽略任何字节流并且不会尝试打开一
   个指向系统标识符的 URI 连接。

InputSource.getCharacterStream()

   获取此输入源的字符流。


20.12.5. "Attributes" 接口
==========================

"Attributes" 对象实现了一部分 *映射协议*，包括 "copy()", "get()",
"__contains__()", "items()", "keys()" 和 "values()" 等方法。 还提供了
下列方法:

Attributes.getLength()

   返回属性的数量。

Attributes.getNames()

   返回属性的名称。

Attributes.getType(name)

   返回属性 *name* 的类型，通常为 "'CDATA'"。

Attributes.getValue(name)

   返回属性 *name* 的值。


20.12.6. "AttributesNS" 接口
============================

此接口是 "Attributes" 接口（参见 Attributes 接口 章节）的一个子类型。
那个接口所支持的所有方法在 "AttributesNS" 对象上也都可用。

下列方法也是可用的:

AttributesNS.getValueByQName(name)

   返回一个限定名称的值。

AttributesNS.getNameByQName(name)

   返回限定名称 *name* 的 "(namespace, localname)" 对。

AttributesNS.getQNameByName(name)

   返回 "(namespace, localname)" 对的限定名称。

AttributesNS.getQNames()

   返回所有属性的限定名称。
