XML作为一种通用的数据交换格式,在各类系统中应用广泛,当需要对多个XML文件中相同路径的节点内容进行统一调整时,使用Python编写自动化脚本是最高效的解决方案。Python标准库中的xml.etree.ElementTree模块提供了完整的XML解析和操作能力,不需要额外安装第三方库就能完成相关任务。

单个XML文件节点修改基础操作
首先我们需要掌握单个XML文件的节点修改逻辑,核心步骤分为解析文件、定位节点、修改内容、写回文件四个部分。下面是一个简单的XML示例文件,我们将修改其中book节点的price子节点内容。
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<name>Python编程入门</name>
<price>59.9</price>
</book>
<book id="2">
<name>数据结构与算法</name>
<price>69.9</price>
</book>
</library>
对应的修改代码如下:
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('test.xml')
# 获取根节点
root = tree.getroot()
# 遍历所有book节点下的price子节点,修改内容
for book in root.findall('book'):
price_node = book.find('price')
if price_node is not None:
# 将价格统一上调10元
original_price = float(price_node.text)
new_price = original_price + 10
price_node.text = str(new_price)
# 将修改后的内容写回原文件
tree.write('test.xml', encoding='UTF-8', xml_declaration=True)
批量处理多个XML文件
实际场景中往往需要修改某个目录下所有的XML文件,这时候需要结合os模块遍历目录,逐个处理每个文件。下面的代码实现了遍历指定目录下所有XML文件并修改节点内容的功能。
import os
import xml.etree.ElementTree as ET
def batch_modify_xml(xml_dir, target_node_path, new_content):
"""
批量修改目录下所有XML文件的指定节点内容
:param xml_dir: XML文件所在目录
:param target_node_path: 目标节点路径,例如'book/price'
:param new_content: 新的节点内容
"""
# 遍历目录下的所有文件
for filename in os.listdir(xml_dir):
if filename.endswith('.xml'):
file_path = os.path.join(xml_dir, filename)
try:
# 解析当前XML文件
tree = ET.parse(file_path)
root = tree.getroot()
# 拆分节点路径,逐层定位
node_parts = target_node_path.split('/')
# 如果路径只有一层,直接查找根节点下的子节点
if len(node_parts) == 1:
target_nodes = root.findall(node_parts[0])
else:
# 多层级路径查找,先找到父节点再找子节点
parent_path = './/' + '/'.join(node_parts[:-1])
target_nodes = []
for parent in root.findall(parent_path):
child = parent.find(node_parts[-1])
if child is not None:
target_nodes.append(child)
# 修改所有目标节点的内容
for node in target_nodes:
node.text = new_content
# 写回文件
tree.write(file_path, encoding='UTF-8', xml_declaration=True)
print(f'成功处理文件: {filename}')
except Exception as e:
print(f'处理文件 {filename} 失败,错误信息: {str(e)}')
# 调用示例:修改当前目录下所有XML文件中book/price节点内容为79.9
if __name__ == '__main__':
batch_modify_xml('./', 'book/price', '79.9')
常见注意事项
- 修改XML文件前建议先备份原文件,避免修改错误导致数据丢失。
- 如果XML文件包含命名空间,需要使用
ET.register_namespace()方法注册命名空间后再进行节点操作。 - 节点路径查找时,
find()方法只返回第一个匹配的节点,findall()返回所有匹配的节点,根据实际需求选择使用。 - 写回文件时指定
xml_declaration=True可以保留XML声明头,避免编码问题。
按条件批量修改节点
有时候我们不需要修改所有节点的内容,而是需要根据节点的属性或者其他子节点的内容做条件判断,下面的示例实现了只修改id为1的book节点的price内容。
import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
# 遍历book节点,根据id属性判断
for book in root.findall('book'):
book_id = book.get('id')
if book_id == '1':
price_node = book.find('price')
if price_node is not None:
price_node.text = '89.9'
tree.write('test.xml', encoding='UTF-8', xml_declaration=True)