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_piend_pi 方法的 Target 对象。注意:start_pi 的参数是 (target, name, data),其中 name 是处理指令目标名(如 "xml-stylesheet"),data 是其内容字符串(不含前后空格,但含内部所有空白)。

from xml.etree import ElementTree as ET

class 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?