xml.sax.xmlreader — XML 解析器的接口 — Python 文档

来自菜鸟教程
Python/docs/3.10/library/xml.sax.reader
跳转至:导航、​搜索

xml.sax.xmlreader — XML 解析器的接口

源代码: :source:`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 接口的实现(参见 属性接口 部分)。 这是一个类似字典的对象,表示 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 版更改: 添加了对类路径对象的支持。

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)
返回功能 功能名称 的当前设置。 如果无法识别该功能,则会引发 SAXNotRecognizedException。 众所周知的功能名称列在模块 xml.sax.handler 中。
XMLReader.setFeature(featurename, value)
功能名称 设置为 。 如果无法识别该功能,则会引发 SAXNotRecognizedException。 如果解析器不支持该功能或其设置,则会引发 SAXNotSupportedException
XMLReader.getProperty(propertyname)
返回属性 propertyname 的当前设置。 如果无法识别该属性,则会引发 SAXNotRecognizedException。 众所周知的属性名列在模块 xml.sax.handler 中。
XMLReader.setProperty(propertyname, value)
属性名称 设置为 。 如果无法识别该属性,则会引发 SAXNotRecognizedException。 如果解析器不支持该属性或其设置,则会引发 SAXNotSupportedException


增量解析器对象

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

IncrementalParser.feed(data)
处理一大块 数据
IncrementalParser.close()
假设文档结束。 这将检查只能在最后检查的格式良好的条件,调用处理程序,并可能清理在解析期间分配的资源。
IncrementalParser.reset()
在调用 close 后调用此方法以重置解析器,以便它准备好解析新文档。 在 close 后调用 parse 或 feed 而不调用 reset 的结果是未定义的。


定位器对象

Locator 的实例提供以下方法:

Locator.getColumnNumber()
返回当前事件开始的列号。
Locator.getLineNumber()
返回当前事件开始的行号。
Locator.getPublicId()
返回当前事件的公共标识符。
Locator.getSystemId()
返回当前事件的系统标识符。


输入源对象

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 接口的子类型(请参阅 属性接口 部分)。 该接口支持的所有方法也可用于 AttributesNS 对象。

还可以使用以下方法:

AttributesNS.getValueByQName(name)
返回限定名称的值。
AttributesNS.getNameByQName(name)
返回 (namespace, localname) 对作为合格的 name
AttributesNS.getQNameByName(name)
返回 (namespace, localname) 对的限定名称。
AttributesNS.getQNames()
返回所有属性的限定名称。