Python iterfind查找XML无匹配元素时设置默认值方法
问题解决方法
你的代码存在两个核心问题:一是未对iterfind的空匹配结果做兜底处理,二是存在多处变量名笔误会导致运行报错。按以下逻辑修改即可实现未匹配到元素时自动追加'NO APLICA'默认值:
修复点说明
- 所有
iterfind查询结果先转为列表判断长度,若长度为0,按对应缺失字段的数量追加默认值 - 修正笔误:遍历DOMAIL节点时的错误变量名
job_nodeOS5改为实际迭代变量job_nodeOS4 - 修正笔误:遍历FOLDER下JOB节点时的未定义变量
tablaGeneral改为外层循环的FOLDER节点变量general - 对「ON节点存在但无DOMAIL子节点」的场景,也补充SUBJECT、MESSAGE字段的默认值
- 变量查询部分的默认值统一设置为
'NO APLICA'
修复后完整代码
default_value = "NO APLICA" for general in tree.iter('FOLDER'): nameFolder = general.attrib.get('FOLDER_NAME') # 修正原代码未定义变量tablaGeneral的问题,改为当前遍历的FOLDER节点general for job_nodeOS in general.iterfind(".//JOB[@APPL_TYPE='OS']"): listaOS.clear() # 注:job_name、daily变量需提前按你的业务逻辑赋值,此处保留原代码逻辑 listaOS.append(job_name) listaOS.append(nameFolder) listaOS.append(daily) # 处理ON节点 on_nodes = list(job_nodeOS.iterfind("ON")) if not on_nodes: # 无ON节点时,补全STMT、CODE、SUBJECT、MESSAGE四个默认值 listaOS.extend([default_value]*4) else: for job_nodeOS3 in on_nodes: listaOS.append(job_nodeOS3.get('STMT', default_value)) listaOS.append(job_nodeOS3.get('CODE', default_value)) # 处理当前ON下的DOMAIL节点 domail_nodes = list(job_nodeOS3.iterfind("DOMAIL")) if not domail_nodes: # 无DOMAIL节点时补SUBJECT、MESSAGE两个默认值 listaOS.extend([default_value]*2) else: # 修正原代码误用不存在变量job_nodeOS5的问题 for job_nodeOS4 in domail_nodes: listaOS.append(job_nodeOS4.get('SUBJECT', default_value)) listaOS.append(job_nodeOS4.get('MESSAGE', default_value)) # 处理VARIABLE节点 for variable_name in variablesOS: variable_node = job_nodeOS.find(f"./VARIABLE[@NAME='{variable_name}']") variable_value = variable_node.get("VALUE", default_value) if variable_node is not None else default_value listaOS.append(variable_value) # 此处添加listaOS的后续存储、输出逻辑即可
效果验证
用你提供的测试XML运行时,各场景输出符合预期:
- 存在ON和DOMAIL的
JOBA任务:正常提取STMT、CODE、SUBJECT、MESSAGE的实际值 - 无ON节点、仅有VARIABLE的
Google_Update_Task_Machine_UA任务:ON相关四个字段自动填充NO APLICA,VARIABLE字段提取实际值 - 既无ON也无VARIABLE的
NOSCHEDULER、NOSCHEDULER_CONMONHDAYS任务:所有缺失字段均自动填充NO APLICA
注:如果业务要求每个JOB固定只保留一组ON相关字段,只需在遍历ON节点时找到第一个匹配项就终止遍历即可,当前代码会按实际存在的ON节点数量追加对应字段。
内容的提问来源于stack exchange,提问作者defekas17
相关产品推荐
相关产品推荐

