xml.sax.xmlreader
— XML 解析器接口¶
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 接口 部分)。
XMLReader 对象¶
XMLReader
接口支持以下方法
- XMLReader.parse(source)¶
处理输入源,生成 SAX 事件。source 对象可以是系统标识符(标识输入源的字符串 - 通常是文件名或 URL)、
pathlib.Path
或 path-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()¶
返回所有属性的限定名称。