You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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()
关键改动说明
  1. 元素缓存字典element_map:每创建一个元素(包括根元素和子元素),都将其存入字典,后续可以通过元素名称直接获取对应的对象,无需递归查找。
  2. 安全获取父元素:通过element_map.get(parent_name)直接获取父元素,避免了find()方法只能查找直接子节点的限制。
  3. 文件上下文管理器:用with open()代替直接open(),确保文件正确关闭。
  4. XML格式化:使用et.indent()方法自动缩进XML,让输出结构更易读(Python 3.9+支持)。
验证输出

运行修正后的代码,将生成符合预期的嵌套XML:

<root_element>
    <AAA>
        <BBB>
            <CCC>
                <DDD />
            </CCC>
        </BBB>
    </AAA>
</root_element>

内容的提问来源于stack exchange,提问作者Dhruv Rajkotiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:10:03