Python实现按指定属性移除XML元素并替换属性内文本
Python处理XML:移除特定属性元素 + 替换属性/文本
我来帮你搞定这个XML处理需求,用Python标准库xml.etree.ElementTree就能轻松实现,不用额外安装依赖。针对你给出的XML片段,我会分场景演示两个核心操作:
1. 按特定属性移除元素
比如我们要移除所有带有lang="en"属性的<category>元素,可以通过遍历定位目标元素,再调用父节点的remove()方法完成删除。
2. 替换属性内的文本
比如我们要把<programme>的channel属性从"BBC Red Button 1"替换成"BBC Sports Extra",直接修改元素的attrib字典即可。
另外我也加一个元素内文本替换的例子(把<title>里的"2018"替换成"2024"),方便你参考扩展。
完整代码示例
import xml.etree.ElementTree as ET # 你的XML内容(如果是本地文件,替换成ET.parse("your_file.xml")即可) xml_content = '''<tv> <programme channel="BBC Red Button 1" start="20180422123000 +0000" stop="20180422125500 +0000"> <title lang="en">Live Snooker: The World Championship: Day Two - 2018</title> <desc lang="en">Coverage of day two at the Crucible Theatre in Sheffield</desc> <category lang="en">Sport</category> <icon src="http://images.radiotimes.com/remote/static.radiotimes.com.edgesuite.net/pa/70/26/webANXsnookerlivebbc.jpg"/> </programme> </tv>''' # 解析XML root = ET.fromstring(xml_content) # 操作1:移除所有lang="en"的<category>元素 # 注意:遍历前转成list,避免修改树结构时打乱迭代器 for category in list(root.findall('.//category[@lang="en"]')): category_parent = category.getparent() category_parent.remove(category) # 操作2:替换<programme>的channel属性文本 for programme in root.findall('.//programme'): if programme.attrib.get('channel') == 'BBC Red Button 1': programme.attrib['channel'] = 'BBC Sports Extra' # 额外示例:替换<title>元素内的文本(把2018改成2024) for title in root.findall('.//title[@lang="en"]'): title.text = title.text.replace('2018', '2024') # 输出修改后的XML(或用ET.ElementTree(root).write("output.xml")保存到文件) ET.indent(root) # 格式化输出,Python 3.9+支持 print(ET.tostring(root, encoding='unicode'))
关键细节说明
- 用
findall()结合XPath表达式精准定位元素:.//category[@lang="en"]表示查找所有层级下带有lang="en"属性的<category>元素 - 遍历元素时转成
list(),是因为直接遍历ElementTree的结果会在删除元素时改变迭代器,导致漏处理部分元素 - 修改属性直接操作元素的
attrib字典,修改元素内文本则操作元素的text属性 - 如果处理本地XML文件,把
ET.fromstring(xml_content)替换成tree = ET.parse("input.xml"); root = tree.getroot()即可,最后用tree.write("output.xml")保存结果
内容的提问来源于stack exchange,提问作者Jamie B




