XML和YAML都是常用的配置文件格式,XML结构严谨但冗余度高,YAML语法简洁可读性更强,很多场景下需要将存量XML配置文件批量转换为YAML格式。通过Python编写自动化脚本可以快速完成这个工作,不需要手动逐行调整内容。

环境准备
实现转换需要用到两个核心第三方库,分别是处理XML解析的xml.etree.ElementTree和处理YAML生成的yaml库,其中yaml库需要提前安装,执行以下命令即可完成安装:
pip install pyyaml
核心转换逻辑
转换的核心流程分为三步:首先解析XML文件获取节点树结构,然后将XML节点树映射为Python的字典结构,最后将字典序列化为YAML格式并输出到文件。下面是完整的实现脚本:
import xml.etree.ElementTree as ET
import yaml
import os
def xml_to_yaml(xml_path, yaml_path):
# 解析XML文件
try:
tree = ET.parse(xml_path)
root = tree.getroot()
except Exception as e:
print(f"解析XML文件失败:{e}")
return False
# 递归转换XML节点为字典
def parse_node(node):
result = {}
# 处理节点的属性
if node.attrib:
result["@attributes"] = node.attrib
# 处理子节点
children = list(node)
if children:
child_dict = {}
for child in children:
child_data = parse_node(child)
# 如果子节点名称重复,转为列表存储
if child.tag in child_dict:
if not isinstance(child_dict[child.tag], list):
child_dict[child.tag] = [child_dict[child.tag]]
child_dict[child.tag].append(child_data.get(child.tag, child_data))
else:
child_dict[child.tag] = child_data.get(child.tag, child_data)
result.update(child_dict)
else:
# 没有子节点时,存储节点文本内容
text = node.text.strip() if node.text else ""
if text:
result[node.tag] = text
else:
result[node.tag] = None
return result
# 生成根字典
data = {root.tag: parse_node(root)}
# 写入YAML文件
try:
with open(yaml_path, "w", encoding="utf-8") as f:
yaml.dump(data, f, allow_unicode=True, default_flow_style=False)
print(f"转换成功,文件已保存至:{yaml_path}")
return True
except Exception as e:
print(f"写入YAML文件失败:{e}")
return False
def batch_convert_xml_to_yaml(xml_dir, yaml_dir):
# 批量转换目录下的所有XML文件
if not os.path.exists(yaml_dir):
os.makedirs(yaml_dir)
for file in os.listdir(xml_dir):
if file.endswith(".xml"):
xml_path = os.path.join(xml_dir, file)
yaml_file = file.replace(".xml", ".yaml")
yaml_path = os.path.join(yaml_dir, yaml_file)
xml_to_yaml(xml_path, yaml_path)
if __name__ == "__main__":
# 单文件转换示例
xml_to_yaml("test_config.xml", "test_config.yaml")
# 批量转换示例,取消下面注释即可使用
# batch_convert_xml_to_yaml("./xml_configs", "./yaml_configs")
使用示例
假设我们有一个名为test_config.xml的XML配置文件,内容如下:
<config>
<database host="127.0.0.1" port="3306">
<username>admin</username>
<password>123456</password>
<dbname>test_db</dbname>
</database>
<log level="info">
<path>/var/log/app.log</path>
</log>
</config>
运行脚本后生成的test_config.yaml内容如下:
config:
database:
@attributes:
host: 127.0.0.1
port: '3306'
username: admin
password: '123456'
dbname: test_db
log:
@attributes:
level: info
path: /var/log/app.log
注意事项
- XML节点的属性会被统一放到
@attributes字段下,避免和子节点名称冲突 - 如果XML中存在同名的兄弟节点,脚本会自动将其转为列表存储,保证数据不丢失
- 生成的YAML默认使用
allow_unicode=True参数,支持中文内容正常显示 - 如果XML结构非常复杂,比如包含嵌套层级超过10层的情况,可以适当调整递归函数的逻辑适配需求
常见问题处理
如果转换后的YAML格式不符合预期,可以先检查XML文件的结构是否规范,比如是否存在未闭合的标签。如果数字类型的字段在YAML中被加上了引号,可以在序列化时添加yaml.SafeDumper的自定义处理逻辑,将纯数字字符串转为对应的数值类型。
转换脚本支持处理大部分常规XML配置文件,对于包含特殊命名空间或者CDATA段的XML文件,需要额外添加对应的解析逻辑,比如使用ET.XMLParser处理CDATA内容。
XML_to_YAMLPython脚本配置文件转换自动化处理修改时间:2026-06-28 00:57:23