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

如何动态解析XML的PNRAmount数据并转换为JSON格式?

动态解析XML转换为JSON的解决方案

步骤1:正确配置命名空间

首先确保命名空间映射与XML中的定义完全一致,这是XPath正确定位节点的关键:

namespace = {
    's': 'http://schemas.xmlsoap.org/soap/envelope/',
    'q': 'http://schemas.navitaire.com/WebServices/ServiceContracts/BookingService',
    'r': 'http://schemas.navitaire.com/WebServices/DataContracts/Booking'
}

步骤2:定位PNRAmount节点

使用XPath准确获取目标节点:

# 获取PNRAmount节点,注意添加命名空间前缀
pnr_amount = myroot.xpath("/s:Envelope/s:Body/q:SellResponse/r:BookingUpdateResponseData/r:Success/r:PNRAmount", namespaces=namespace)[0]

步骤3:动态构建JSON字典

遍历PNRAmount下的所有子节点,自动提取字段名和对应值,无需硬编码字段顺序或数量:

PNR = {}
for child in pnr_amount:
    # 提取不带命名空间的标签名
    tag_name = child.tag.split('}')[-1] if '}' in child.tag else child.tag
    # 处理文本为空的情况,避免报错
    if child.text is not None:
        PNR[tag_name] = child.text.strip()
    else:
        PNR[tag_name] = ''  # 可根据需求调整空值处理逻辑

完整代码示例

# 假设myroot已通过lxml等库解析得到
namespace = {
    's': 'http://schemas.xmlsoap.org/soap/envelope/',
    'q': 'http://schemas.navitaire.com/WebServices/ServiceContracts/BookingService',
    'r': 'http://schemas.navitaire.com/WebServices/DataContracts/Booking'
}

# 定位PNRAmount节点
pnr_amount = myroot.xpath("/s:Envelope/s:Body/q:SellResponse/r:BookingUpdateResponseData/r:Success/r:PNRAmount", namespaces=namespace)[0]

# 动态构建JSON结构
PNR = {}
for child in pnr_amount:
    tag_name = child.tag.split('}')[-1] if '}' in child.tag else child.tag
    PNR[tag_name] = child.text.strip() if child.text is not None else ''

print(PNR)

优势说明

  • 适配字段变化:无论PNRAmount下新增、删除或调整字段顺序,代码都能自动识别并提取,无需修改解析逻辑
  • 降低维护成本:避免了硬编码字段索引和名称带来的重复劳动与出错风险
  • 鲁棒性提升:处理了文本为空的节点,防止因None值导致的报错

内容的提问来源于stack exchange,提问作者Hitesh Gorantla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:05:19