Excel转XML时如何跳过无数据空单元格及多余part节点
解决方法
问题出在你当前的代码无论C/D是否有有效数据,都会创建并添加part2节点,而且代码里存在几个拼写错误(比如PricePeriod1应该是part1,最后重复添加了part1)。要实现需求,只需要在添加part2前判断它是否包含有效内容(即非空的C/D节点),只有存在有效内容时才将其加入Contract。
以下是修正后的完整代码:
import xml.etree.ElementTree as ET # 假设tree是已加载的XML树 for contract in tree.findall("Contract"): part1 = ET.Element("part") # 标记是否需要创建part2 has_valid_cd = False # 收集有效的C/D节点 valid_cd_nodes = [] start_date = contract.find("StartDate").text end_date = contract.find("EndDate").text # 构建part1的Start和End节点 ET.SubElement(part1, "Start").text = start_date ET.SubElement(part1, "End").text = end_date # 遍历原Contract的子节点,分类处理 for child in list(contract): # 用list避免遍历过程中修改节点树的异常 contract.remove(child) if child.tag in ["A", "B"]: part1.append(child) elif child.tag in ["C", "D"]: # 处理文本为None或纯空格的情况 if child.text and child.text.strip(): valid_cd_nodes.append(child) has_valid_cd = True # 添加part1到Contract(A/B始终有数据,必加) contract.append(part1) # 仅当存在有效C/D节点时,创建并添加part2 if has_valid_cd: part2 = ET.Element("part") ET.SubElement(part2, "Start").text = start_date ET.SubElement(part2, "End").text = end_date for node in valid_cd_nodes: part2.append(node) contract.append(part2) # 保存修改后的XML tree.write("output.xml", encoding="utf-8", xml_declaration=True)
关键改进点:
- 有效内容判断:用
has_valid_cd标记是否存在非空的C/D节点,仅为True时才创建part2 - 空值处理优化:覆盖了
child.text为None或纯空格的无效场景,避免误判 - 修复代码错误:修正了变量名拼写错误,以及重复添加part1的问题
- 遍历稳定性优化:用
list(contract)遍历节点,避免修改节点树时引发遍历异常
这样修改后,当C/D列都无有效数据时,Contract下只会生成包含A/B的part节点,不会出现空的part2节点。
内容的提问来源于stack exchange,提问作者JaniH
相关产品推荐
相关产品推荐

