0

0

如何用递归构建带缩进的嵌套 XML(基于任务依赖关系)

碧海醫心

碧海醫心

发布时间:2026-02-05 10:46:04

|

857人浏览过

|

来源于php中文网

原创

如何用递归构建带缩进的嵌套 XML(基于任务依赖关系)

本文介绍如何将任务依赖列表递归转换为结构清晰、缩进规范的嵌套 xml,解决原始代码中“末级子节点丢失”和“无缩进输出”的核心问题,并通过字典预索引与健壮递归逻辑确保所有节点(包括叶子节点)均被正确渲染。

在处理具有父子/依赖关系的任务数据时,常需将其可视化为树形 XML 结构。原始代码虽采用递归思路,但存在两个关键缺陷:

  1. 末级节点缺失:当某任务的 taskIdRelated 在输入列表中找不到对应记录(即该节点为叶子),原逻辑直接跳过创建,导致如 task5、task22、task8 等终端节点未生成 元素;
  2. 无格式化缩进:ET.tostring() 默认输出单行 XML,可读性差,不利于调试与集成。

以下方案通过三步优化彻底解决:

✅ 步骤一:预构建哈希索引(O(1) 查找)

将原始 tasks 列表转为字典 task_dict,以 taskId(即每行首字段)为键,避免每次递归都遍历全量列表:

task_dict = {task[0]: task for task in tasks}

✅ 步骤二:健壮递归构造(处理叶子节点)

定义 build_xml(task_dict, task),其核心逻辑为:

Quillbot
Quillbot

一款AI写作润色工具,QuillBot的人工智能改写工具将提高你的写作能力。

下载
  • 若 task 存在,则用前 3 字段(taskId, taskIdType, taskIdDescription)创建父
  • 查询 task[3](taskIdRelated)是否存在于 task_dict 中:
    • 若存在 → 递归构建子元素;
    • 若不存在 → 仍创建子元素,但使用 task[3:](即 taskIdRelated, taskIdRelatedType, taskIdRelatedDescription)作为其属性值 —— 这正是修复末级节点的关键!
def create_element(taskId, taskType, taskDescription):
    elem = ET.Element('task')
    elem.set('taskId', taskId)
    elem.set('taskIdType', taskType)
    elem.set('taskIdDescription', taskDescription)
    return elem

def build_xml(task_dict, task):
    if not task:
        return None
    # 创建当前节点(使用前3字段)
    curr_elem = create_element(*task[:3])
    # 获取关联ID
    related_id = task[3]
    # 递归获取子节点:若存在则递归,否则用关联字段直接创建叶子节点
    child_task = task_dict.get(related_id)
    child_elem = build_xml(task_dict, child_task) if child_task else create_element(*task[3:])
    curr_elem.append(child_elem)
    return curr_elem
⚠️ 注意:create_element(*task[3:]) 安全成立,因 task 是长度为 6 的元组,task[3:] 恰好为 (taskIdRelated, taskIdRelatedType, taskIdRelatedDescription),完美匹配函数签名。

✅ 步骤三:自动缩进 + 根节点识别

  • 使用 ET.indent(task_element, space="\t", level=0) 启用内置缩进(Python 3.9+);
  • 根节点 = taskId 不在任何 taskIdRelated 字段中出现的任务,用集合差集高效计算:
def find_root_tasks(task_dict):
    all_ids = set(task_dict.keys())
    related_ids = {t[3] for t in task_dict.values()}
    return [task_dict[tid] for tid in all_ids - related_ids]

# 主流程
for root_task in find_root_tasks(task_dict):
    root_elem = build_xml(task_dict, root_task)
    ET.indent(root_elem, space="\t", level=0)  # 关键:添加缩进
    print(ET.tostring(root_elem, encoding='unicode'))

✅ 最终效果与验证

输出严格匹配需求:

  • task1 链路完整呈现至 task5;
  • task2 直接包含 task22 自闭合标签;
  • 所有层级按深度缩进,结构一目了然;
  • 支持多根(如 taskX 独立分支)且无重复或遗漏。

? 提示:若需兼容 Python 标准库增强能力。

此方案兼顾正确性、可读性与性能,是处理任意深度依赖图生成结构化 XML 的通用范式。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1914

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2095

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1098

2024.11.28

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3533

2024.08.14

微信网页版文件传输助手教程合集
微信网页版文件传输助手教程合集

本专题整合了微信网页版文件传输助手教程、入口等等内容,阅读专题下面的文章了解更多详细内容。

15

2026.02.04

微信文件过期恢复教程
微信文件过期恢复教程

本专题整合了微信文件过期恢复方法、技巧教程,阅读专题下面的文章了解更多详细内容。

10

2026.02.04

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

93

2026.02.04

学习通网页版入口与在线学习指南 学习通官网登录与使用方法
学习通网页版入口与在线学习指南 学习通官网登录与使用方法

本专题详细汇总了学习通网页版入口与登录方法,提供学习通官方网页端入口、学生登录平台、网页版使用指南等内容,帮助用户快速稳定地登录学习通官网,顺利进入学习平台,提升学习效率和体验。

17

2026.02.04

Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

13

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号