Python遍历XML元素去重 按Class+Location求和JobRecord的Salary
直接操作XML节点的实现方案
你可以直接使用Python标准库xml.etree.ElementTree直接操作XML节点,不需要转换为字典、列表或DataFrame结构,完整实现代码如下:
import xml.etree.ElementTree as ET # 1. 解析XML,读取文件用 ET.parse('你的文件路径.xml') 即可 xml_str = ''' <StaffRecords> <EmployeeName>John Doe</EmployeeName> <EmployeeTitle>Financial Analyst</EmployeeTitle> <Positions> <JobRecord> <Class>100</Class> <Location>7</Location> <Salary>40000</Salary> </JobRecord> <JobRecord> <Class>100</Class> <Location>7</Location> <Salary>40000</Salary> </JobRecord> </Positions> </StaffRecords> ''' root = ET.fromstring(xml_str) # 读取文件的话用 root = ET.parse('你的文件路径.xml').getroot() # 2. 定位Positions节点,初始化分组缓存 positions_node = root.find('Positions') job_group = {} # 3. 遍历所有JobRecord完成分组求和 for job in positions_node.findall('JobRecord'): cls_val = job.find('Class').text.strip() loc_val = job.find('Location').text.strip() salary_val = int(job.find('Salary').text.strip()) group_key = (cls_val, loc_val) if group_key not in job_group: # 首次出现的分组,保留当前节点 job_group[group_key] = [salary_val, job] else: # 重复分组,仅累加薪资 job_group[group_key][0] += salary_val # 4. 清空原有全部JobRecord节点 for job in positions_node.findall('JobRecord'): positions_node.remove(job) # 5. 将去重求和后的节点重新插入Positions for total_sal, keep_job in job_group.values(): keep_job.find('Salary').text = str(total_sal) positions_node.append(keep_job) # 输出结果,写入文件用 ET.ElementTree(root).write('输出路径.xml', encoding='utf-8') ET.indent(root) # Python 3.9及以上版本支持格式化缩进 print(ET.tostring(root, encoding='unicode'))
实现说明
- 全程直接操作XML原生Element节点,没有做整体结构转换
- 临时字典仅用作分组求和的缓存,不涉及XML全量转储为其他数据结构
- 处理完成后直接修改原XML树,可直接保存为XML文件,符合强制格式要求
内容的提问来源于stack exchange,提问作者myownthememusic
相关产品推荐
相关产品推荐

