Python如何将一个XML节点移动到另一个父节点下
发布时间 - 2026-01-05 00:00:00 点击率:次XML节点移动只需直接调用append()或insert(),无需手动remove;跨树节点需先copy();含命名空间时find须传入ns参数;移动后建议用ET.indent()格式化。
直接调用 append() 或 insert() 就能移动节点
XML 节点在 xml.etree.ElementTree 中是引用对象,不是深拷贝。只要把目标节点从原父节点的 children 列表中移除(或不显式移除),再调用新父节点的 append(),它就自动脱离旧位置、挂到新位置下。
常见错误是先 copy.deepcopy() —— 这会创建新节点,失去“移动”语义,变成复制;或者手动遍历 parent.remove(child) 再 append,其实多余,因为 append() 本身不检查归属,而 ElementTree 的节点只能有一个父节点,插入时自动解绑旧父级。
-
append()总是加到子节点末尾 -
insert(i, elem)可指定索引位置(i超出范围会自动截断) - 被移动的
elem若已有父节点,其旧父节点的children列表会自动更新(无需手动remove)
移动前必须确保节点属于当前树,且未被重复插入
如果节点来自另一个 ElementTree 实例(比如用 ET.fromstring() 单独解析的片段),直接 append() 会报错:ValueError: Attempt to add non-element node 或更隐蔽地导致序列化异常。这是因为跨树节点不能直接混用。
此时必须先用 element.copy()(浅拷贝,保留子树结构)或重新解析为同树节点:
立即学习“Python免费学习笔记(深入)”;
from xml.etree import ElementTree as ET假设 source_tree 和 target_tree 是两个独立解析的树
src_node = source_tree.find(".//item") dst_parent = target_tree.find(".//container")
❌ 错误:跨树节点不能直接 append
dst_parent.append(src_node)
✅ 正确:拷贝进目标树上下文
dst_parent.append(src_node.copy())
用 find() 和 findall() 定位节点时注意作用域和命名空间
移动操作依赖精准定位。若 XML 含命名空间(如 ),不声明前缀会导致 find() 返回 None,后续 append() 就变成向 None 添加,抛出 AttributeError。
- 用字典声明命名空间:
ns = {"ns": "http://purl.org/rss/1.0/"} - 查找时带上前缀:
tree.find(".//ns:item", ns) - 移动后若需写回文件,
ET.tostring()默认不输出声明,可用method="xml"+ 手动添加xmlns属性避免解析失败
移动后记得调用 ET.indent()(Python 3.9+)或手动格式化再写入
移动操作本身不改变缩进,原始 XML 的换行和空格会被保留,但节点移动后父子层级关系变化,可能导致输出混乱(比如子节点挤在父标签同一行)。Python 3.9+ 可直接用内置 ET.indent():
ET.indent(target_tree, space=" ", level=0)
with open("output.xml", "wb") as f:
target_tree.write(f, encoding="utf-8", xml_declaration=True)低于 3.9 版本需引入第三方库(如 x)或自行递归处理文本节点缩进——这点容易被忽略,结果 XML 能解析但人眼难读、diff 工具误判变更。
mltodict
# python
# node
# app
# 工具
# ai
# 作用域
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
EditPlus中的正则表达式实战(5)
如何在阿里云购买域名并搭建网站?
Laravel如何实现数据库事务?(DB Facade示例)
iOS UIView常见属性方法小结
如何为不同团队 ID 动态生成多个非值班状态按钮
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
Python面向对象测试方法_mock解析【教程】
如何在万网自助建站中设置域名及备案?
node.js报错:Cannot find module 'ejs'的解决办法
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
使用Dockerfile构建java web环境
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
如何在万网主机上快速搭建网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
利用vue写todolist单页应用
Swift中循环语句中的转移语句 break 和 continue
如何用腾讯建站主机快速创建免费网站?
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel怎么调用外部API_Laravel Http Client客户端使用
EditPlus中的正则表达式 实战(2)
如何用景安虚拟主机手机版绑定域名建站?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
详解jQuery中的事件
创业网站制作流程,创业网站可靠吗?
5种Android数据存储方式汇总
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel如何实现API版本控制_Laravel版本化API设计方案
,网页ppt怎么弄成自己的ppt?
打造顶配客厅影院,这份100寸电视推荐名单请查收
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
香港服务器如何优化才能显著提升网站加载速度?
php485函数参数是什么意思_php485各参数详细说明【介绍】
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
海南网站制作公司有哪些,海口网是哪家的?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何使用Vite进行前端资源打包?(配置示例)

