使用Python拆分含TestCaseID的Comment标签大型XML文件
拆分大型XML文件为单个测试用例文件(Python实现)
针对你的需求,我修改了代码,实现遇到含#Test Case ID:的comment标签时,将对应测试用例拆分保存为独立XML文件,同时兼顾大型XML的内存效率:
import xml.etree.ElementTree as et import os # 创建输出目录,不存在则自动创建 output_dir = "split_test_cases" os.makedirs(output_dir, exist_ok=True) current_test_case = None test_case_id = None parent_stack = [] # 用栈跟踪XML节点的层级关系,获取父节点 # 迭代解析大型XML,避免加载整个文件到内存 xml_iter = et.iterparse('Main.xml', events=('start', 'end')) for event, elem in xml_iter: if event == 'start': # 进入节点时压入栈 parent_stack.append(elem) elif event == 'end': # 离开节点时弹出栈 parent_stack.pop() # 处理节点文本(去除首尾空白) elem_text = elem.text.strip() if elem.text else "" # 检测到测试用例标识的comment标签 if "comment" in elem.tag and "#Test Case ID:" in elem_text: # 先保存上一个未完成的测试用例 if current_test_case is not None: # 生成XML树并写入文件 tree = et.ElementTree(current_test_case) file_path = os.path.join(output_dir, f"{test_case_id}.xml") with open(file_path, 'wb') as f: tree.write(f, encoding='utf-8', xml_declaration=True) # 清理节点释放内存 current_test_case.clear() # 提取测试用例ID test_case_id = elem_text.split("#Test Case ID:")[1].strip() # 假设comment的父节点就是单个测试用例的根节点(可根据你的XML结构调整) current_test_case = elem.getparent() # 保存最后一个测试用例 if current_test_case is not None and test_case_id is not None: tree = et.ElementTree(current_test_case) file_path = os.path.join(output_dir, f"{test_case_id}.xml") with open(file_path, 'wb') as f: tree.write(f, encoding='utf-8', xml_declaration=True) current_test_case.clear()
关键说明:
- 内存高效处理:使用
et.iterparse迭代解析XML,不会一次性加载整个文件,适合处理大型XML。 - 节点层级跟踪:通过
parent_stack栈解决ElementTree元素无内置父节点的问题,准确获取测试用例的根节点。 - 拆分逻辑:在
comment标签的end事件中检测标识,确保文本已完整加载;每个测试用例保存为以ID命名的XML文件。 - 内存清理:处理完每个测试用例后调用
clear(),避免内存占用过高。
如果你的XML结构中,测试用例的根节点不是comment的父节点,只需调整current_test_case = elem.getparent()这一行,改为对应测试用例的起始节点即可。
内容的提问来源于stack exchange,提问作者sura
相关产品推荐
相关产品推荐

