Python ElementTree怎么处理处理指令
发布时间 - 2026-01-08 00:00:00 点击率:次ElementTree默认丢弃处理指令(PI),因其定位为轻量级数据处理器;需用XMLParser配自定义Target类捕获PI,或改用支持PI的lxml.etree。
ElementTree 默认
会丢弃处理指令(PI)
Python 标准库的 xml.etree.ElementTree 在解析 XML 时,默认跳过所有处理指令(如 、),既不保留在树中,也不提供回调接口。这不是 bug,而是设计取舍:ElementTree 定位是“轻量级、面向数据的 XML 处理”,而非完整 XML 1.0 合规解析器。
想保留 PI,必须用 XMLParser 配合自定义 target
标准方式是绕过高层 API,手动构造 XMLParser,传入实现了 start_pi 和 end_pi 方法的 Target 对象。注意:start_pi 的参数是 (target, name, data),其中 name 是处理指令目标名(如 "xml-stylesheet"),data 是其内容字符串(不含前后空格,但含内部所有空白)。
from xml.etree import ElementTree as ETclass PITarget: def init(self): self.pis = [] def start_pi(self, target, data): self.pis.append((target, data)) def end_pi(self): pass def start_element(self, args): pass def end_element(self, args): pass def data(self, data): pass def close(self): return None
parser = ET.XMLParser(target=PITarget()) with open("doc.xml", "rb") as f: result = parser.close() # 注意:不是 parser.parse()
result.pis 现在包含所有 PI 元组
lxml 是更现实的选择
如果你实际需要可靠地读写带 PI 的 XML(比如 XHTML 文档头部的样式表声明、SVG 中的 XML 声明扩展),lxml.etree 是更可行的方案。它原生支持 PI 节点,可被当作普通元素操作:
-
etree.ProcessingInstruction类型节点存在于.getchildren()或迭代结果中 - 可用
tree.iter("{http://www.w3.org/2000/xmlns/}processing-instruction")查找(注意命名空间前缀) - 序列化时默认保留 PI,无需额外配置
代价是引入第三方依赖,但对生产环境中的 XML 处理来说,这通常是值得的。
别试图用正则或字符串替换补救
常见误区是先用 ET.tostring() 得到 bytes,再用正则插入 PI——这极易破坏编码声明位置(XML 声明必须在第一行)、损坏 UTF-8 BOM、或导致后续解析失败。ElementTree 的输出不保证格式稳定,且不处理 PI 重排逻辑。真要插 PI,应直接操作底层 lxml 的节点树,或在生成原始 XML 字符串阶段就组织好。
# php
# python
# html
# svg
# 处理器
# 编码
# app
# 标准库
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
在centOS 7安装mysql 5.7的详细教程
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel怎么在Blade中安全地输出原始HTML内容
如何在服务器上三步完成建站并提升流量?
昵图网官网入口 昵图网素材平台官方入口
制作企业网站建设方案,怎样建设一个公司网站?
JavaScript模板引擎Template.js使用详解
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何在阿里云通过域名搭建网站?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
微信小程序制作网站有哪些,微信小程序需要做网站吗?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
免费网站制作appp,免费制作app哪个平台好?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
简单实现Android验证码
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
利用python获取某年中每个月的第一天和最后一天
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
用yum安装MySQLdb模块的步骤方法
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
利用vue写todolist单页应用
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
JavaScript中的标签模板是什么_它如何扩展字符串功能
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何用腾讯建站主机快速创建免费网站?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何在阿里云高效完成企业建站全流程?
如何快速搭建高效可靠的建站解决方案?
Laravel怎么上传文件_Laravel图片上传及存储配置
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?


会丢弃处理指令(PI)