Skip to main content

20.12. 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方法接受数据。解析完成后,调用关闭reset方法必须被调用以使解析器准备接受新数据,从feed或使用parse方法。

注意,这些方法必须在解析期间调用 not,也就是说,在解析被调用之后,在返回之前。

默认情况下,类还使用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 接口 部分)。

20.12.1. XMLReader对象

XMLReader 接口支持以下方法:

XMLReader.parse(source)

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

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

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

20.12.2. IncrementalParser对象

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

IncrementalParser.feed(data)

处理 data 的一块。

IncrementalParser.close()

假设文档的结束。这将检查只能在结束时检查的良好形成条件,调用处理程序,并可以清理在解析期间分配的资源。

IncrementalParser.reset()

在调用close之后调用此方法以重置解析器,以便它可以解析新文档。关闭后调用解析或进给,而不调用reset的结果未定义。

20.12.3. 定位器对象

Locator 的实例提供这些方法:

Locator.getColumnNumber()

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

Locator.getLineNumber()

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

Locator.getPublicId()

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

Locator.getSystemId()

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

20.12.4. 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)

设置此输入源的字节流(binary file)。

如果还指定了字符流,SAX解析器将忽略此操作,但它将使用字节流优先于打开URI连接本身。

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

InputSource.getByteStream()

获取此输入源的字节流。

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

InputSource.setCharacterStream(charfile)

设置此输入源的字符流(text file)。

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

InputSource.getCharacterStream()

获取此输入源的字符流。

20.12.5. Attributes 接口

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

Attributes.getLength()

返回属性的数量。

Attributes.getNames()

返回属性的名称。

Attributes.getType(name)

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

Attributes.getValue(name)

返回属性 name 的值。

20.12.6. AttributesNS 接口

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

还有以下方法:

AttributesNS.getValueByQName(name)

返回限定名称的值。

AttributesNS.getNameByQName(name)

返回合格 name(namespace, localname) 对。

AttributesNS.getQNameByName(name)

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

AttributesNS.getQNames()

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