ElementTree遍历XML时仅获取当前FOLDER下JOB属性的问题求解
问题根因
你的代码出现重复输出的核心原因是:内层遍历JOB节点时调用的是全局文档对象tree的iter('JOB')方法,这个方法会递归扫描整个XML文档中所有的JOB节点,和外层循环当前拿到的FOLDER节点没有任何绑定关系,所以每遍历到一个FOLDER,都会把全文档所有JOB打印一遍。另外内外层循环使用了同名变量nodes,也存在变量覆盖的逻辑隐患。
修改方法
将内层遍历的调用主体从全局tree替换为外层循环当前取到的FOLDER节点,仅遍历当前FOLDER下的JOB子节点即可,同时建议区分内外层循环的变量名,避免混淆。
修改后的代码如下:
import xml.etree.ElementTree as ET # 替换为你实际的XML文件路径 tree = ET.parse('your_file_path.xml') for folder in tree.iter('FOLDER'): folder_name = folder.attrib.get('FOLDER_NAME') print(f'NameFolder is ...{folder_name}') # 仅遍历当前FOLDER节点下的所有JOB for job in folder.iter('JOB'): job_name = job.attrib.get('JOBNAME') print(f'NAMEEEE .... {job_name}')
运行结果
执行后将直接输出你预期的分组效果:
NameFolder is ...FOLDER_ONE NAMEEEE .... JOBA NAMEEEE .... JOBB NameFolder is ...FOLDER_TWO NAMEEEE .... JOBC NAMEEEE .... JOBD
补充:如果所有JOB都是FOLDER的直接子节点、不存在多层嵌套,内层循环也可以用
folder.findall('JOB')实现,效果和folder.iter('JOB')一致;如果JOB可能嵌套在FOLDER下的其他子节点中,用iter兼容性更好。
内容的提问来源于stack exchange,提问作者Luis perez
相关产品推荐
相关产品推荐

