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.Pathpath-like 对象,或 InputSource 对象。当 parse() 返回时,输入将完全处理完毕,并且可以丢弃或重置解析器对象。

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

在 3.8 版本中更改: 添加了对 path-like 对象的支持。

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 的编码属性。

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

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