如何动态解析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
相关产品推荐
相关产品推荐

