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

2.0 版中的新Function。

SAX 解析器实现XMLReader接口。它们在 Python 模块中实现,该模块必须提供create_parser()函数。 xml.sax.make_parser()不带任何参数调用此函数以创建新的解析器对象。

  • 类别 xml.sax.xmlreader. XMLReader

    • 可以由 SAX 解析器继承的 Base Class。
  • 类别 xml.sax.xmlreader. IncrementalParser

    • 在某些情况下,希望不要立即解析 Importing 源,而是在文档块可用时提供它们。请注意,阅读器通常不会读取整个文件,但也会分块读取它。在处理完整个文档之前,parse()1 不会返回。因此,如果不希望parse()的阻塞行为,则应使用这些接口。

解析器实例化后,就可以立即开始从 feed 方法接受数据了。解析完成后,pass调用 close 来结束,必须调用 reset 方法以使解析器准备好接受来自 feed 或使用 parse 方法的新数据。

请注意,在解析过程中(即在调用解析之后且返回之前),这些方法一定不能*被调用。

默认情况下,该类还使用 IncrementalParser 接口的 feed,close 和 reset 方法来实现 XMLReader 接口的 parse 方法,以方便 SAX 2.0 驱动程序编写器。

  • 类别 xml.sax.xmlreader. Locator

    • 用于将 SAX 事件与文档位置相关联的界面。定位器对象仅在调用 DocumentHandler 方法期间才返回有效结果。在任何其他时间,结果都是不可预测的。如果没有可用信息,则方法可能返回None
    • class * xml.sax.xmlreader. InputSource([* systemId *])
    • 封装XMLReader读取实体所需的信息。

此类可以包括有关公共标识符,系统标识符,字节流(可能带有字符编码信息)和/或实体的字符流的信息。

应用程序将创建此类的对象以用于XMLReader.parse()方法并从 EntityResolver.resolveEntity 返回。

InputSource属于应用程序,但是XMLReader不允许修改从应用程序传递给它的InputSource对象,尽管它可以进行复制和修改。

  • 类别 xml.sax.xmlreader. AttributesImpl(属性)

    • 这是Attributes接口的实现(请参见属性界面部分)。这是一个类似于字典的对象,代表startElement()调用中的元素属性。除了最有用的字典操作外,它还支持接口所描述的许多其他方法。此类的对象应由 Reader 实例化。 * attrs *必须是类似于字典的对象,其中包含从属性名称到属性值的 Map。
    • class * xml.sax.xmlreader. AttributesNSImpl(* attrs qnames *)
    • AttributesImpl的名称空间感知变体,将传递给startElementNS()。它是从AttributesImpl派生的,但是将属性名称理解为* namespaceURI localname *的二 Tuples。此外,它提供了许多方法,这些方法期望在原始文档中出现合格名称。此类实现AttributesNS接口(请参见AttributesNS 接口部分)。

19.14.1. XMLReader 对象

XMLReader界面支持以下方法:

  • XMLReader. parse(* source *)

    • 处理 Importing 源,产生 SAX 事件。 * source *对象可以是系统标识符(标识 Importing 源的字符串,通常是文件名或 URL),类似文件的对象或InputSource对象。返回parse()时,将完全处理 Importing,并且可以丢弃或重置解析器对象。作为限制,当前的实现只接受字节流。字符流的处理有待进一步研究。
  • XMLReader. getContentHandler ( )

  • XMLReader. setContentHandler(* handler *)

  • XMLReader. getDTDHandler ( )

  • XMLReader. setDTDHandler(* handler *)

  • XMLReader. getEntityResolver ( )

  • XMLReader. setEntityResolver(* handler *)

    • 设置当前的EntityResolver。如果未设置EntityResolver,则try解析外部实体将导致打开该实体的系统标识符,如果该标识符不可用,则失败。
  • XMLReader. getErrorHandler ( )

  • XMLReader. setErrorHandler(* handler *)

    • 设置当前的错误处理程序。如果未设置ErrorHandler,则将引发错误(异常)并打印警告。
  • XMLReader. setLocale(* locale *)

    • 允许应用程序设置错误和警告的语言环境。

SAX 解析器不需要为错误和警告提供本地化;如果它们不能支持请求的语言环境,则必须引发 SAX 异常。应用程序可能会在解析过程中请求更改语言环境。

  • XMLReader. getFeature(* featurename *)

    • 返回Function* featurename *的当前设置。如果无法识别该Function,则会引发SAXNotRecognizedException。模块xml.sax.handler中列出了众所周知的Function名称。
  • XMLReader. setFeature(* featurename value *)

    • 将* featurename 设置为 value 。如果无法识别该Function,则会引发SAXNotRecognizedException。如果解析器不支持该Function或其设置,则会引发 SAXNotSupportedException *。
  • XMLReader. getProperty(* propertyname *)

    • 返回属性* propertyname *的当前设置。如果无法识别该属性,则会引发SAXNotRecognizedException。知名属性名称在模块xml.sax.handler中列出。
  • XMLReader. setProperty(属性名称)

    • 将* propertyname 设置为 value 。如果无法识别该属性,则引发SAXNotRecognizedException。如果解析器不支持该属性或其设置,则引发 SAXNotSupportedException *。

19.14.2. IncrementalParser 对象

IncrementalParser的实例提供以下其他方法:

  • IncrementalParser. feed(* data *)

    • 处理* data *数据块。
  • IncrementalParser. close ( )

    • 假设文档结尾。这将检查格式正确的条件,这些条件只能在最后检查,调用处理程序,并可以清理在解析过程中分配的资源。
  • IncrementalParser. reset ( )

    • 在调用 close 重置解析器后,将调用此方法,以便可以解析新文档。关闭后调用而不解析重置的解析或提要的结果是不确定的。

19.14.3. 定位器对象

Locator的实例提供以下方法:

  • Locator. getColumnNumber ( )

    • 返回当前事件开始的列号。
  • Locator. getLineNumber ( )

    • 返回当前事件开始的行号。
  • Locator. getPublicId ( )

    • 返回当前事件的公共标识符。
  • Locator. getSystemId ( )

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

19.14.4. InputSource 对象

  • InputSource. setPublicId(* id *)

  • InputSource. getPublicId ( )

  • InputSource. setSystemId(* id *)

  • InputSource. getSystemId ( )

  • InputSource. setEncoding(编码)

编码必须是 XML 编码语句可接受的字符串(请参阅 XML 建议的 4.3.3 节)。

如果InputSource还包含字符流,则将忽略InputSource的编码属性。

  • InputSource. getEncoding ( )

    • 获取此 InputSource 的字符编码。
  • InputSource. setByteStream(* bytefile *)

    • 设置此 Importing 源的字节流(不执行字节到字符转换的类似 Python 文件的对象)。

如果还指定了一个字符流,则 SAX 解析器将忽略此设置,但是它会优先使用字节流而不是打开 URI 连接本身。

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

  • InputSource. getByteStream ( )
    • 获取此 Importing 源的字节流。

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

  • InputSource. setCharacterStream(* charfile *)
    • 设置此 Importing 源的字符流。 (该流必须是 Python 1.6 Unicode 包裹的文件,该文件必须转换为 Unicode 字符串.)

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

  • InputSource. getCharacterStream ( )
    • 获取此 Importing 源的字符流。

19.14.5. 属性界面

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

  • Attributes. getLength ( )

    • 返回属性数。
  • Attributes. getNames ( )

    • 返回属性的名称。
  • Attributes. getType(* name *)

    • 返回属性* name *的类型,通常为'CDATA'
  • Attributes. getValue(* name *)

    • 返回属性* name *的值。

19.14.6. AttributesNS 接口

此接口是Attributes接口的子类型(请参阅属性界面)。该接口支持的所有方法在AttributesNS对象上也可用。

也可以使用以下方法:

  • AttributesNS. getValueByQName(* name *)

    • 返回限定名称的值。
  • AttributesNS. getNameByQName(* name *)

    • 返回(namespace, localname)对以获取合格的* name *。
  • AttributesNS. getQNameByName(* name *)

    • 返回(namespace, localname)对的合格名称。
  • AttributesNS. getQNames ( )

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