You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动