Python怎么用xml.sax模块进行事件驱动解析

星降
发布: 2025-12-12 17:22:03
原创
490人浏览过
Python的xml.sax模块是基于事件驱动的XML解析工具,适用于大文件或内存受限场景;需继承ContentHandler类并重写startElement、characters、endElement等方法来处理标签和文本事件。

python怎么用xml.sax模块进行事件驱动解析

Python 的 xml.sax 模块是标准库中用于事件驱动(SAX)XML 解析的工具,适合处理大文件、内存受限或只需提取部分数据的场景。它不加载整个文档到内存,而是边读边触发回调,由你定义的处理器响应事件。

核心思路:写一个 ContentHandler 子类

SAX 解析的关键是实现 xml.sax.handler.ContentHandler 的子类,重写其中的方法来捕获开始标签、结束标签、文本内容等事件。系统会在解析过程中自动调用这些方法。

  • startElement(name, attrs):遇到开始标签时调用,name 是标签名,attrsxml.sax.xmlreader.AttributesImpl 对象,可用 attrs.get('attr_name')dict(attrs) 获取属性
  • characters(content):遇到标签内文本时调用,注意可能被多次调用(比如含换行或CDATA),需累积拼接
  • endElement(name):遇到结束标签时调用,可在此做收尾操作(如保存当前对象、清空临时变量)

基本使用步骤

三步走:准备处理器 → 创建解析器 → 解析文件或流

  • 定义自己的 ContentHandler 子类(比如叫 BookHandler
  • xml.sax.make_parser() 创建解析器实例
  • 调用 parser.setContentHandler(your_handler) 设置处理器
  • 调用 parser.parse('file.xml')parser.parse(io.StringIO(xml_str))

一个小而完整的例子

假设 XML 是这样:

立即学习Python免费学习笔记(深入)”;

Procys
Procys

AI驱动的发票数据处理

Procys 102
查看详情 Procys

  
    Python Cookbook
    David Beazley
  

对应处理器可以这样写:

import xml.sax
<p>class BookHandler(xml.sax.ContentHandler):
def <strong>init</strong>(self):
self.books = []
self.current_tag = ""
self.current_book = {}
self.buffer = ""</p><pre class="brush:php;toolbar:false;">def startElement(self, name, attrs):
    self.current_tag = name
    if name == "book":
        self.current_book = {"id": attrs.get("id", "")}

def characters(self, content):
    if self.current_tag in ("title", "author"):
        self.buffer += content.strip()

def endElement(self, name):
    if name == "title":
        self.current_book["title"] = self.buffer
    elif name == "author":
        self.current_book["author"] = self.buffer
    elif name == "book":
        self.books.append(self.current_book)
    self.buffer = ""
    self.current_tag = ""
登录后复制

使用

handler = BookHandler() parser = xml.sax.make_parser() parser.setContentHandler(handler) parser.parse("books.xml") print(handler.books) # [{'id': '101', 'title': 'Python Cookbook', 'author': 'David Beazley'}]

注意事项和常见坑

SAX 是流式解析,没有 DOM 那样的树结构,也不支持 XPath 或回溯。几个实用提醒:

  • 文本内容(characters)可能被拆成多次调用,别直接覆盖,要累积
  • 标签嵌套靠你自己用或状态变量管理(比如用 self.depth 或列表记录当前路径)
  • 如果 XML 有命名空间,需继承 xml.sax.handler.ContentHandler 并重写 startElementNS 等方法
  • 报错时默认会抛异常,可通过 parser.setErrorHandler() 自定义错误处理

基本上就这些。SAX 不复杂但容易忽略字符分段和状态维护,写清楚逻辑就能稳定工作。

以上就是Python怎么用xml.sax模块进行事件驱动解析的详细内容,更多请关注php中文网其它相关文章!

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号