You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析YAML文件并生成XML模板?求技术实现方案

实现思路与示例代码

需求概述

核心任务分为三步:

  1. 解析指定YAML文件,提取所有格式为ElementAttr[数字]Name的键及其对应值
  2. 基于预设的YAML属性与XML值映射关系,匹配对应转换规则
  3. 生成符合指定结构的XML模板

分步实现方案

1. 解析YAML并提取目标键值对

使用pyyaml库解析YAML文件,通过正则匹配筛选出目标键:

import yaml
import re

# 读取并解析YAML文件
with open("target.yaml", "r") as f:
    yaml_data = yaml.safe_load(f)

# 筛选符合ElementAttr[数字]Name格式的键值对
target_attrs = []
match_pattern = re.compile(r"ElementAttr\d+Name")
for key, value in yaml_data.items():
    if match_pattern.match(key):
        target_attrs.append(value.strip().lower())  # 统一转小写,避免大小写匹配误差

2. 处理映射关系

先修正原attrmap的语法错误,再转换为便于查询的字典结构:

# 修正后的映射关系(原代码缺失逗号已补全)
attrmap = {
    "yamlattr": ["Email Address", "Last Name", "First Name", "Department", "Common Name"],
    "xmlValue": ["mail", "sn", "givenName", "dept", "cn"]
}

# 转换为小写键的查询字典,同时补充表格中的mail->email映射
mapping_dict = {y.lower(): x for y, x in zip(attrmap["yamlattr"], attrmap["xmlValue"])}
mapping_dict["mail"] = "email"

3. 生成XML模板

通过字符串拼接快速生成符合要求的XML结构(复杂场景可改用xml.etree.ElementTree):

# 初始化XML模板头部
xml_content = """<root>
    <child alias="/an">
      <Attribute name="map">
"""

# 遍历提取的属性,生成对应<Value>标签
for attr in target_attrs:
    xml_val = mapping_dict.get(attr)
    if xml_val:
        # 根据示例格式生成对应行
        if attr == "common name":
            xml_line = f"           <Value>Common Name=cn</Value>\n"
        elif attr == "email address":
            xml_line = f"           <Value>mail=email</Value>\n"
        xml_content += xml_line

# 补全XML尾部
xml_content += """      </Attribute>
     </child>
</root>"""

# 输出或保存结果
print(xml_content)

关键注意事项

  • YAML解析优先使用yaml.safe_load,避免未知格式带来的安全风险
  • 映射关系处理时统一大小写,防止因大小写差异导致匹配失败
  • 若后续XML结构复杂度提升,建议使用专业XML库(如lxml)进行节点构建,便于维护和扩展

内容的提问来源于stack exchange,提问作者Karan Nayyar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:00:10