19.15. xml.parsers.expat —使用 Expat 的快速 XML 解析

Warning

pyexpat模块对于防止恶意构建的数据并不安全。如果您需要解析不可信或未经身份验证的数据,请参见XML vulnerabilities

2.0 版中的新Function。

xml.parsers.expat模块是 Expat 非验证 XML 解析器的 Python 接口。该模块提供了一个 extensionsxmlparser,它表示 XML 解析器的当前状态。创建xmlparser对象后,可以将对象的各种属性设置为处理函数。然后将 XML 文档 Importing 解析器时,将为 XML 文档中的字符数据和标记调用处理程序函数。

该模块使用pyexpat模块提供对 Expat 解析器的访问。不建议直接使用pyexpat模块。

此模块提供一个异常和一个类型对象:

xml.parsers.expat模块包含两个Function:

Expat 可以选择为您提供 XML 名称空间处理,方法是为* namespace_separator *提供一个值。该值必须是一个单字符字符串;如果字符串的长度非法(则将None视为与Ellipsis相同),则将引发ValueError。启用名称空间处理后,属于名称空间的元素类型名称和属性名称将被扩展。传递给元素处理程序StartElementHandlerEndElementHandler的元素名称将是名称空间 URI,名称空间分隔符和名称的本地部分的串联。如果名称空间分隔符为零字节(chr(0)),则名称空间 URI 和本地部分将被串联而没有任何分隔符。

例如,如果将* namespace_separator *设置为空格字符(' '),并且将分析以下文档:

<?xml version="1.0"?>
<root xmlns    = "http://default-namespace.org/"
      xmlns:py = "http://www.python.org/ns/">
  <py:elem1 />
  <elem2 xmlns="" />
</root>

StartElementHandler将为每个元素接收以下字符串:

http://default-namespace.org/ root
http://www.python.org/ns/ elem1
elem2

由于pyexpat使用的Expat库中的限制,返回的xmlparser实例只能用于解析单个 XML 文档。为每个文档调用ParserCreate以提供唯一的解析器实例。

See also

19.15.1. XMLParser 对象

xmlparser对象具有以下方法:

2.1 版中的新Function。

为* flag *传递错误的值将取消先前传递真实值的调用,否则无效。

该方法只能在调用Parse()ParseFile()方法之前调用;在调用其中任何一个之后调用它会导致ExpatErrorcode属性设置为errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING的情况下引发。

2.3 版的新Function。

xmlparser个对象具有以下属性:

2.3 版的新Function。

在 2.6 版中更改:现在可以更改缓冲区大小。

2.3 版的新Function。

2.3 版的新Function。

2.1 版中的新Function。

在版本 1.6 中更改:可以随时更改以影响结果类型。

2.1 版中的新Function。

以下属性包含与xmlparser对象遇到的最新错误相关的值,并且仅在对Parse()ParseFile()的调用引发xml.parsers.expat.ExpatError异常后才具有正确的值。

以下属性包含与xmlparser对象中的当前解析位置有关的值。在报告解析事件的回调过程中,它们指示生成事件的字符序列中第一个字符的位置。在回调之外调用时,指示的位置将刚好在上一个解析事件之后(无论是否有关联的回调)。

2.4 版的新Function。

这是可以设置的处理程序列表。要在xmlparser对象* o *上设置处理程序,请使用o.handlername = func。 * handlername 必须从以下列表中获取,并且 func *必须是接受正确数目的参数的可调用对象。除非另有说明,否则参数均为字符串。

2.1 版中的新Function。

2.1 版中的新Function。

对于要解析的外部实体,必须实现此处理程序。它负责使用ExternalEntityParserCreate(context)创建子解析器,并使用适当的回调对其进行初始化,并解析实体。该处理程序应返回一个整数;如果返回0,则解析器将引发XML_ERROR_EXTERNAL_ENTITY_HANDLING错误,否则解析将 continue。

如果未提供此处理程序,则由DefaultHandler回调(如果提供)报告外部实体。

19.15.2. ExpatError 异常

ExpatError异常具有许多有趣的属性:

2.1 版中的新Function。

2.1 版中的新Function。

2.1 版中的新Function。

19.15.3. Example

下面的程序定义了三个只输出其参数的处理程序。

import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
    print 'Start element:', name, attrs
def end_element(name):
    print 'End element:', name
def char_data(data):
    print 'Character data:', repr(data)

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)

该程序的输出为:

Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent

19.15.4. 内容模型说明

使用嵌套 Tuples 描述内容模型。每个 Tuples 包含四个值:类型,量词,名称和子级 Tuples。子代只是附加的内容模型描述。

前两个字段的值是在xml.parsers.expat模块的model对象中定义的常量。这些常量可以分为两组:模型类型组和量词组。

模型类型组中的常量为:

量词组中的常量为:

19.15.5. 扩展错误常量

xml.parsers.expat模块的errors对象中提供了以下常量。这些常量在解释发生错误时引发的ExpatError异常对象的某些属性时很有用。

errors对象具有以下属性:

Footnotes

首页