0

0

YAML到XML的数据结构映射

畫卷琴夢

畫卷琴夢

发布时间:2026-01-21 10:55:31

|

111人浏览过

|

来源于php中文网

原创

YAML与XML无一一对应关系,映射需人工定义规则;Python中可用pyyaml+ElementTree手动构建XML树,yq仅适用于简单扁平化转换;命名空间、CDATA、属性等语义需额外约定。

yaml到xml的数据结构映射

YAML 和 XML 的结构差异直接影响映射逻辑

YAML 是以缩进和键值对为核心的序列化格式,天然支持嵌套、锚点、合并等高级特性;XML 则依赖显式标签、属性、文本节点和命名空间。二者没有一一对应关系,强行“转换”必然丢失语义或引入歧义。比如 !!null!!timestamp、多行字面量(|)在 XML 中无原生等价物;而 XML 的 xmlnsxml:lang、处理指令()在 YAML 中也不存在。

因此,所谓“映射”,实际是按需定义规则:你决定哪个 YAML 键变成 XML 标签名,哪些值转为属性还是子元素,数组如何展开,空值怎么表示( 还是 ),是否保留注释(YAML 注释不进 AST,XML 注释需显式写入)。

用 Python 的 pyyaml + xml.etree.ElementTree 手动构建 XML 树

这是最可控的方式,适合结构固定、需精细控制命名空间或特殊节点的场景。核心思路是:先用 yaml.safe_load() 解析 YAML 为 Python 原生数据(dict/list/str/None),再递归遍历,按规则生成 Element 节点。

常见注意事项:

  • YAML 键名含非法 XML 字符(如空格、冒号)时,必须清洗或报错,否则 ElementTree 构建失败
  • None 值默认转为空标签(),若需 ,得显式判断并设置 .text = ""
  • 列表项统一转为同名子元素(如 items: [a, b]ab),但也可按需改为
  • 顶层必须是 dict;若 YAML 是纯列表或标量,需包裹一层根节点
import yaml
import xml.etree.ElementTree as ET

def yaml_to_xml_element(data, tag_name="root"): elem = ET.Element(tag_name) if isinstance(data, dict): for key, value in data.items():

清洗 key:替换非法字符,避免冒号(除非处理命名空间)

        clean_key = key.replace(":", "_").replace(" ", "_")
        child = yaml_to_xml_element(value, clean_key)
        elem.append(child)
elif isinstance(data, list):
    for item in data:
        # 列表项统一用 "item" 标签,可按需改
        child = yaml_to_xml_element(item, "item")
        elem.append(child)
else:
    elem.text = str(data) if data is not None else ""
return elem

示例 YAML 字符串

yaml_str = """ config: version: "1.2" features:

  • auth
  • logging timeout: 30 """

data = yaml.safe_load(yaml_str) root = yaml_to_xml_element(data, "config") print(ET.tostring(root, encoding="unicode", method="xml"))

yq 命令行工具做简单扁平化转换

当 YAML 结构较浅、且只需快速生成可读 XML(不追求标准兼容性或命名空间),yq(v4+,基于 go-yq)配合内置 XML 输出是最轻量方案。它把 YAML 键当作标签名,值作为文本内容,数组展开为重复标签。

MyBatis3.2.3帮助文档 中文CHM版
MyBatis3.2.3帮助文档 中文CHM版

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。有需要的朋友可以下载看看

下载

限制明显:

  • 不支持自定义根节点名(默认 root
  • 无法将 YAML 键映射为 XML 属性(所有数据都进 .text
  • 空值转为 ,不可控
  • 中文或特殊字符可能被转义(取决于终端和版本)

示例命令:

$ echo 'name: Alice\nage: 30\nhobbies: [reading, coding]' | yq -o=xml

  Alice
  30
  reading
  coding

别忽略命名空间、CDATA 和属性——它们不是“可选增强”

真实 XML 场景中,xmlnsxsi:typexml:base 等属性常是协议必需项;某些字段(如 HTML 片段、JS 代码)需包裹在 中;而 idref 类字段本应是属性而非子元素。这些在 YAML 源中没有任何语法提示,全靠人工约定或额外元数据(如加前缀 @id 表示属性,!cdata 表示需要 CDATA 包裹)。

这意味着:如果 YAML 来自第三方或需长期维护,必须在文档或 schema 中明确定义这些映射规则,否则后续解析方无法还原原始语义。自动工具只负责“结构搬运”,语义对齐永远是人的责任。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

659

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

710

2023.08.11

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

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

共4课时 | 11.1万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

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

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