0

0

Python xml.sax.ContentHandler 重写startElement解析标签

煙雲

煙雲

发布时间:2026-03-01 08:26:48

|

822人浏览过

|

来源于php中文网

原创

startelement中标签名和属性分别通过name(str)与attrs(attributesimpl)获取;attrs不支持下标索引,须用get()或items();命名空间会使name含uri前缀;需手动维护状态并配合endelement和characters使用。

python xml.sax.contenthandler 重写startelement解析标签

startElement 方法里怎么拿到标签名和属性

标签名和属性都从 nameattrs 两个参数来,不是从字符串里自己切——这是初学者最常绕弯的地方。其中 name 是 str,直接可用;attrsxml.sax.xmlreader.AttributesImpl 类型,它支持按 key 查(attrs.get('id')),也支持遍历(attrs.items()),但不支持直接用方括号索引(attrs['id'] 会报 TypeError)。

常见错误现象:写成 attrs['class'] 导致解析中断;或把 name 当成带尖括号的完整标签(比如误以为是 "<user>"</user>),其实只是 "user"

  • attrs.get('required') 安全取值,没这个属性就返回 None
  • 需要默认值时用 attrs.get('type', 'text')
  • 遍历所有属性:用 for k, v in attrs.items():,别用 .keys() 再去查

为什么 startElement 不触发或只触发一次

多半是 XML 源数据本身有问题,xml.sax 默认不处理 DTD 或命名空间,遇到不规范的声明或编码问题会静默失败或跳过后续解析。

典型场景:读取网络返回的 XML、本地文件含 BOM、或者用了 xmlns 但没重写 startPrefixMapping。这时候 startElement 可能根本不会被调用,或者只在根节点触发一次,子节点全没了。

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

扣子编程
扣子编程

扣子推出的AI编程开发工具

下载
  • 确保文件以 UTF-8 无 BOM 打开:open(path, 'rb') + xml.sax.parse(),别用 open(..., encoding='utf-8') 直接传字符串
  • 如果 XML 带命名空间(如 <rss xmlns="http://purl.org/rss/1.0/"></rss>),name 实际是 "{http://purl.org/rss/1.0/}rss",得用字符串前缀匹配,不能硬比 "rss"
  • 加个空的 error 处理器能看到真实报错:parser.setErrorHandler(xml.sax.handler.ErrorHandler())

在 startElement 里该不该存状态变量

可以存,但必须小心生命周期——ContentHandler 实例是复用的,同一个对象会贯穿整个解析过程。如果你在 startElement 里给 self.current_tag = name,那它会在下一次 startElement 被覆盖,而 characters 回调里读到的可能是上一个标签的内容。

容易踩的坑:用全局变量或类属性缓存中间状态,却忘了在 endElement 清掉,导致后续标签逻辑错乱;或者在 characters 里直接拼接文本,但没跳过空白换行,结果把缩进当内容。

  • 进标签时设标志:if name == 'title': self.in_title = True
  • 出标签时清标志:def endElement(self, name): if name == 'title': self.in_title = False
  • characters 中只处理 self.in_title 为真时的非空白文本:text.strip() 再追加

和 xml.etree.ElementTree 比,sax 适合什么场景

适合大文件流式解析(几百 MB 以上)、内存受限、或只需要提取少量字段的场景。它不建树、不缓存,边读边触发回调,峰值内存基本恒定。但代价是:没有父/子/兄弟导航,不能 XPath 查询,也不能改写或序列化。

性能影响明显:100MB XML,ElementTree.parse() 可能吃掉 1.5GB 内存并卡住几秒;sax.parse() 通常稳定在 20MB 内存、秒级完成。但如果你要找“所有 user 下的第三个 email”,用 sax 就得自己数层级、记栈深,很容易漏或错。

  • 纯抽取:用 sax 更稳
  • 要校验结构、反复查询、或后续还要生成 XML:老实用 ElementTreelxml
  • 混合方案可行:用 sax 快速扫一遍定位目标块,再用 ElementTree.fromstring() 解析那一段小片段
解析过程中真正难的不是写 startElement,而是搞清哪些状态必须靠你自己维护、哪些边界条件(比如空标签、嵌套同名标签、非法字符)会悄悄让回调顺序出错。一旦开始依赖 self 上的临时变量,就得同步考虑 endElementcharacters 的配合节奏——这里没语法错误,但错一点,结果就偏很远。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

835

2023.08.22

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2113

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1142

2024.11.28

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.10.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

87

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

103

2025.09.18

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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