如何用Python将XML转换为YAML格式

Python将XML转YAML需先用xmltodict.parse()解析为嵌套字典,再用yaml.dump()序列化;注意处理属性(@前缀)、同名子元素(转列表)、混合文本(#text键),并设置indent、allow_unicode、default_flow_style=False和sort_keys=False以保证可读性与结构保真。

用Python将XML转换为YAML,核心是先解析XML为Python原生数据结构(如字典、列表),再用PyYAML序列化为YAML字符串。关键在于合理处理XML的嵌套、属性、文本内容和重复子元素,避免信息丢失或结构失真。

安装必要依赖

需要两个主流库:xmltodict用于轻量、直观地将XML转为嵌套字典;pyyaml用于输出格式良好、可读性强的YAML。

执行以下命令安装:

pip install xmltodict pyyaml

基础转换:单次解析 + 标准输出

适用于结构清晰、无复杂命名空间或混合内容的XML文件。使用xmltodict.parse()读取字符串,再用yaml.dump()转出。

示例代码:

import xmltodict
import yaml

# 读取XML字符串(也可用open().read()读文件)
xml_str = """Alice30Beijing"""

# 转为有序字典
data_dict = xmltodict.parse(xml_str)

# 转为YAML,设置indent和allow_unicode保证可读性
yaml_str = yaml.dump(data_dict, indent=2, allow_unicode=True)
print(yaml_str)

输出效果接近:

root:
  name: Alice
  age: '30'
  city: Beijing

处理常见XML特性

真实XML常含属性、同名多节点、空标签或混合文本。需注意以下几点:

  • 属性默认转为@属性名:例如{"@id": "101"};如需去掉@前缀,可用xmltodict.parse(..., attr_prefix="")
  • 同名子元素自动转为列表:即使只有一个,也会变成["value"];若希望单个也保持字典,加参数force_list=("item",)
  • 文本内容与子元素并存时,用#text键保存文本:如helloworld{"a": {"#text": "hello", "b": "world"}};可设cdata_key="_text"自定义该键名

写入文件并控制YAML格式

生成YAML后,建议写入文件并启用安全、易读的选项:

with open("output.yaml", "w", encoding="utf-8") as f:
  yaml.dump(
    data_dict,
    f,
    indent=2,
    allow_unicode=True,
    default_flow_style=False,
    sort_keys=False  # 保持XML原有顺序(xmltodict默认保留顺序)
  )

default_flow_style=False确保用块格式而非JSON式内联;sort_keys=False防止字段重排,更贴近原始XML结构。