在系统集成和配置管理中,经常需要将以YAML编写的数据结构转换为XML文档。YAML凭借简洁的缩进语法被广泛用于配置文件,而XML凭借严格的标签结构在旧有系统和接口中仍占重要地位。明确二者的结构对应关系,是完成可靠转换的前提。

YAML与XML的结构差异
YAML通过缩进表示层级,支持对象、数组和标量。XML则使用开始和结束标签包裹内容,属性写在标签内。下面的简单示例展示了同一份数据在两种格式下的样子。
# YAML表示
person:
name: 张三
age: 30
hobbies:
- 阅读
- 游泳
<person> <name>张三</name> <age>30</age> <hobbies>阅读</hobbies> <hobbies>游泳</hobbies> </person>
常见映射规则
对象映射
YAML中的对象(键值对集合)通常映射为XML中的一个父标签,其每个键成为子标签,值递归映射。
数组映射
YAML数组可以映射为多个同名子标签,也可以使用带索引的属性。若数组元素是对象,则每个元素用一个父标签包裹。
标量映射
字符串、数字等标量一般作为标签内的文本内容。如果某项在语义上更适合作为元信息,可映射为XML属性。
使用Python实现转换
借助PyYAML和xml.etree.ElementTree,可以编写简单的转换函数。以下代码演示了基础对象与数组的映射处理。
import yaml
import xml.etree.ElementTree as ET
def yaml_to_xml(data, root_name):
# 创建根节点
root = ET.Element(root_name)
def build(node, value):
if isinstance(value, dict):
for k, v in value.items():
child = ET.SubElement(node, k)
build(child, v)
elif isinstance(value, list):
for item in value:
# 列表项使用父节点名加item语义,这里简单用父节点标签重复
child = ET.SubElement(node, 'item')
build(child, item)
else:
node.text = str(value)
build(root, data)
return ET.tostring(root, encoding='unicode')
yaml_text = '''
server:
host: 127.0.0.1
ports:
- 8080
- 9090
'''
data = yaml.safe_load(yaml_text)
xml_str = yaml_to_xml(data, 'config')
print(xml_str)
注意事项
- YAML的空值应明确映射为空白文本或省略标签,避免XML解析异常。
- 带特殊字符的文本需进行XML转义,如<、&等。
- 若原YAML含有多文档,需分别映射为多个XML文件或根节点。
通过上述规则和示例代码,开发者可以快速将YAML数据结构映射为XML,从而顺利完成系统间的数据格式对接。