xml.sax.xmlreader — XML 解析器的接口 — Python 文档
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,但将属性名称理解为 namespaceURI 和 localname 的二元组。 此外,它还提供了许多方法,期望它们出现在原始文档中的限定名称。 此类实现AttributesNS
接口(请参阅 AttributesNS 接口 部分)。
XMLReader 对象
XMLReader 接口支持以下方法:
- XMLReader.parse(source)
处理输入源,产生 SAX 事件。 source 对象可以是系统标识符(标识输入源的字符串 - 通常是文件名或 URL)、pathlib.Path 或 path-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()
- 返回所有属性的限定名称。