Python遍历目录XML抽取Elem节点插入Main.xml对应位置的实现咨询
XML节点批量插入合并解决方案
需求说明
- 遍历指定目录下除
Main.xml外的所有XML文件(如Get.xml、Set.xml、Try.xml等) - 提取每个XML文件中的
<Elem>节点及其全部子元素 - 将提取到的
<Elem>节点插入到Main.xml中name属性与当前XML文件名(不含后缀)匹配的<Test>节点内部
现有代码问题梳理
- 第一版代码逻辑为节点替换,会直接删除原
Main.xml中的<Test>节点,不符合插入需求 - 第二版代码仅针对单个
Get.xml做处理,未实现批量遍历,且每次循环就写入文件,重复IO操作效率低 - 两版代码均未统一处理
Main.xml的加载逻辑,重复加载会导致前序插入的内容被覆盖 - 未做递归查找
<Elem>节点的兼容,若<Elem>不在XML根节点直接子级位置会匹配失败
可直接运行的实现代码
import os import xml.etree.ElementTree as ET from copy import deepcopy def find_elem_node(node): """递归查找指定节点下的Elem节点""" for child in node: if child.tag == 'Elem': return child sub_res = find_elem_node(child) if sub_res is not None: return sub_res return None if __name__ == '__main__': # 配置参数:根据实际情况修改xml所在目录路径 xml_dir = './' main_xml_path = os.path.join(xml_dir, 'Main.xml') # 预加载Main.xml,只加载一次避免覆盖之前的修改 dest_tree = ET.parse(main_xml_path) dest_root = dest_tree.getroot() # 遍历目录下所有xml文件 for filename in os.listdir(xml_dir): # 跳过Main.xml和非xml文件 if not filename.endswith('.xml') or filename == 'Main.xml': continue # 获取文件名前缀,对应Test节点的name属性 file_prefix = os.path.splitext(filename)[0] file_path = os.path.join(xml_dir, filename) # 读取源XML文件,查找Elem节点 source_tree = ET.parse(file_path) source_root = source_tree.getroot() elem_node = find_elem_node(source_root) if elem_node is None: print(f"警告:文件{filename}中未找到Elem节点,跳过") continue # 查找Main.xml中对应name的Test节点 target_test_node = None for test_node in dest_root.iter('Test'): if test_node.get('name') == file_prefix: target_test_node = test_node break if target_test_node is None: print(f"警告:Main.xml中未找到name为{file_prefix}的Test节点,跳过{filename}") continue # 深拷贝Elem节点后追加到Test节点内部 target_test_node.append(deepcopy(elem_node)) # 所有修改完成后统一写入文件 dest_tree.write(main_xml_path, encoding='utf-8', xml_declaration=True) print("处理完成,已更新Main.xml")
注意事项
- 如果XML带命名空间,需要在标签查找时加上命名空间前缀,调整
find_elem_node和Test节点查找的匹配逻辑即可 - 若允许覆盖原有
<Test>节点下的内容,可在追加前先清空target_test_node的所有子节点:for child in list(target_test_node): target_test_node.remove(child) - 运行前建议备份原始
Main.xml文件,避免误操作丢失数据
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

