如何修正Python代码以基于JSON配置生成正确嵌套XML
问题分析
原代码的核心问题是只能在根节点的直接子元素中查找父节点,root.find()方法只会搜索当前节点的直接子节点,无法递归查找深层嵌套的元素。当处理CCC和DDD时,因为它们的父节点不在根的直接子元素里,path会返回None,导致代码错误地将它们直接添加到根节点下。
修正方案
我们需要维护一个元素缓存字典,记录所有已创建的XML元素(键为元素名称,值为对应的Element对象),这样无论父元素处于哪个层级,都能直接从字典中获取并添加子元素。
修正后的代码:
import os import json import xml.etree.ElementTree as et def generate(): config_path = os.path.join(os.getcwd(), "config", "xml_config.json") with open(config_path, 'r') as f: data = json.load(f) element_map = {} # 缓存所有已创建的元素 root = None for item in data['Elements']: if item['Element type'] == 'root': root = et.Element(item['Element name']) element_map[item['Element name']] = root elif item['Element type'] == 'sub_element': parent_name = item['Parent element'] # 从缓存中直接获取父元素 parent_element = element_map.get(parent_name) if parent_element: child_element = et.SubElement(parent_element, item['Element name']) element_map[item['Element name']] = child_element # 格式化输出XML,让结构更清晰 et.indent(root, space=" ") print(et.tostring(root, encoding='unicode', method='xml')) if __name__ == "__main__": generate()
关键改动说明
- 元素缓存字典
element_map:每创建一个元素(包括根元素和子元素),都将其存入字典,后续可以通过元素名称直接获取对应的对象,无需递归查找。 - 安全获取父元素:通过
element_map.get(parent_name)直接获取父元素,避免了find()方法只能查找直接子节点的限制。 - 文件上下文管理器:用
with open()代替直接open(),确保文件正确关闭。 - XML格式化:使用
et.indent()方法自动缩进XML,让输出结构更易读(Python 3.9+支持)。
验证输出
运行修正后的代码,将生成符合预期的嵌套XML:
<root_element> <AAA> <BBB> <CCC> <DDD /> </CCC> </BBB> </AAA> </root_element>
内容的提问来源于stack exchange,提问作者Dhruv Rajkotiya
相关产品推荐
相关产品推荐

