Python的xml.sax模块是基于事件驱动的XML解析工具,适用于大文件或内存受限场景;需继承ContentHandler类并重写startElement、characters、endElement等方法来处理标签和文本事件。

Python 的 xml.sax 模块是标准库中用于事件驱动(SAX)XML 解析的工具,适合处理大文件、内存受限或只需提取部分数据的场景。它不加载整个文档到内存,而是边读边触发回调,由你定义的处理器响应事件。
SAX 解析的关键是实现 xml.sax.handler.ContentHandler 的子类,重写其中的方法来捕获开始标签、结束标签、文本内容等事件。系统会在解析过程中自动调用这些方法。
name 是标签名,attrs 是 xml.sax.xmlreader.AttributesImpl 对象,可用 attrs.get('attr_name') 或 dict(attrs) 获取属性三步走:准备处理器 → 创建解析器 → 解析文件或流
ContentHandler 子类(比如叫 BookHandler)xml.sax.make_parser() 创建解析器实例parser.setContentHandler(your_handler) 设置处理器parser.parse('file.xml') 或 parser.parse(io.StringIO(xml_str))
假设 XML 是这样:
立即学习“Python免费学习笔记(深入)”;
对应处理器可以这样写:
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.sax.handler.ContentHandler 并重写 startElementNS 等方法parser.setErrorHandler() 自定义错误处理基本上就这些。SAX 不复杂但容易忽略字符分段和状态维护,写清楚逻辑就能稳定工作。
以上就是Python怎么用xml.sax模块进行事件驱动解析的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号