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,但将属性名称理解为 namespaceURIlocalname 的两元组。此外,它还提供了许多需要原始文档中出现的限定名称的方法。此类别实现 AttributesNS 接口(参见 AttributesNS 接口 一节)。

XMLReader 对象

XMLReader 接口支持以下方法

XMLReader.parse(source)

处理输入源,生成 SAX 事件。source 对象可以是系统标识符(标识输入源的字符串——通常是文件名或 URL)、pathlib.Path路径类 对象,或 InputSource 对象。当 parse() 返回时,输入已完全处理,解析器对象可以丢弃或重置。

3.5 版本中有所变更: 增加了对字符流的支持。

3.8 版本中有所变更: 增加了对路径类对象的支持。

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

IncrementalParser 对象

IncrementalParser 的实例提供以下附加方法

IncrementalParser.feed(data)

处理一段 data

IncrementalParser.close()

假定文档的结尾。这将检查只能在结尾处检查的良好格式条件,调用处理器,并可能清理解析期间分配的资源。

IncrementalParser.reset()

在调用 close 之后调用此方法以重置解析器,使其准备好解析新文档。在调用 close 后不调用 reset 就调用 parse 或 feed 的结果是未定义的。

Locator 对象

Locator 的实例提供这些方法

Locator.getColumnNumber()

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

Locator.getLineNumber()

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

Locator.getPublicId()

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

Locator.getSystemId()

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

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.getEncoding()

获取此 InputSource 的字符编码。

InputSource.setByteStream(bytefile)

为此输入源设置字节流(一个 二进制文件)。

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

如果应用程序知道字节流的字符编码,则应使用 setEncoding 方法进行设置。

InputSource.getByteStream()

获取此输入源的字节流。

getEncoding 方法将返回此字节流的字符编码,如果未知则返回 None

InputSource.setCharacterStream(charfile)

为此输入源设置字符流(一个 文本文件)。

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

InputSource.getCharacterStream()

获取此输入源的字符流。

Attributes 接口

Attributes 对象实现 映射协议 的一部分,包括方法 copy(), get(), __contains__(), items(), keys()values()。还提供以下方法

Attributes.getLength()

返回属性的数量。

Attributes.getNames()

返回属性的名称。

Attributes.getType(name)

返回属性 name 的类型,通常为 'CDATA'

Attributes.getValue(name)

返回属性 name 的值。

AttributesNS 接口

此接口是 Attributes 接口的子类型(请参见 Attributes 接口 一节)。该接口支持的所有方法在 AttributesNS 对象上也可用。

还提供以下方法

AttributesNS.getValueByQName(name)

返回限定名称的值。

AttributesNS.getNameByQName(name)

返回限定 name(namespace, localname) 对。

AttributesNS.getQNameByName(name)

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

AttributesNS.getQNames()

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