Python中XML转CSV遇大括号数据致json.loads报错求解决
解决XML转CSV时JSON解析的"未闭合字符串"错误
问题根源
你的XML中<RData>节点内的JSON字符串存在两处语法错误,直接导致json.loads()失败:
- 键名
unid的引号未闭合:比如"unid:1234,应该是"unid":"1234", enterdata字段值里的大括号未转义:JSON字符串内的{和}需要转义为\{和\}
解决方案步骤
- 解析XML提取RData内容:处理XML的命名空间,正确取出
<RData>里的字符串 - 修复JSON语法错误:用正则表达式修正键名格式并转义大括号
- 解析JSON并转换为CSV:将修复后的JSON数据写入CSV文件
完整代码
import xml.etree.ElementTree as ET import json import re import csv # 1. 解析XML,处理命名空间 tree = ET.parse('your_xml_file.xml') # 替换成你的XML文件路径 root = tree.getroot() # 定义XML命名空间 namespaces = { 'soap': 'http://schemas.xmlsoap.org/soap/envelope/', 'default': 'testatatstip' } # 提取RData节点的文本内容 rdata_text = root.find('.//default:RData', namespaces).text # 2. 修复JSON语法错误 # 修复unid键的引号:将"unid:xxx,替换为"unid":"xxx", fixed_text = re.sub(r'"unid:(\d+),', r'"unid":"\1",', rdata_text) # 转义字符串内的{和} fixed_text = re.sub(r'(?<=")([{}])(?=")', lambda m: f'\\{m.group(1)}', fixed_text) # 3. 解析JSON并写入CSV try: data_list = json.loads(fixed_text) # 获取所有字段名(假设所有对象字段一致) fieldnames = data_list[0].keys() # 写入CSV with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerows(data_list) print("CSV转换成功!") except json.JSONDecodeError as e: print(f"JSON解析错误:{e}") except Exception as e: print(f"其他错误:{e}")
代码说明
- XML解析:通过命名空间定位
<RData>节点,避免因命名空间导致的查找失败 - 正则修复:
- 第一处正则匹配
"unid:数字,的格式,替换为标准键值对格式 - 第二处正则匹配字符串内部的
{和}(前后为双引号),添加转义符
- 第一处正则匹配
- CSV写入:用
csv.DictWriter直接将JSON对象列表写入CSV,自动处理表头和行数据
注意事项
- 如果
unid的值不全是数字,可调整正则为r'"unid:([^,]+),', r'"unid":"\1",' - 若
enterdata字段的大括号出现在字符串中间,当前正则依然有效,会匹配所有字符串内的{和} - 建议先打印
fixed_text检查修复后的JSON格式,确认无误后再执行解析转换
内容的提问来源于stack exchange,提问作者KJT
相关产品推荐
相关产品推荐

