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

Python xmltodict.parse解析含\x07的XML报无效令牌异常如何解决

问题根因

XML 1.0 标准对文档内允许出现的字符有明确限制,除了\t(0x09)、\n(0x0A)、\r(0x0D)三个控制字符外,其余0x00-0x08、0x0B-0x0C、0x0E-0x1F区间的ASCII控制字符都属于非法字符,哪怕文档编码是合规UTF-8、标签引号闭合完全正确,解析器遇到这类字符也会直接抛出not well-formed (invalid token)异常。你遇到的\x07(响铃控制符)刚好在非法字符区间内,就是解析失败的直接原因。

处理方案

在调用xmltodict.parse()前,先对原始XML文本做预处理,过滤掉所有非法控制字符即可,参考实现如下:

import re
import requests
import xmltodict

# 预编译正则匹配XML 1.0标准下所有非法控制字符
ILLEGAL_XML_PATTERN = re.compile(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]")

response = requests.get(dp_url, params=dp_params)
# 先清洗非法字符再解析
cleaned_xml_content = ILLEGAL_XML_PATTERN.sub("", response.text)

try:
    dict_response = xmltodict.parse(cleaned_xml_content)
except Exception as e:
    print(e)

针对你提供的示例XML,清洗后narrative字段里的\x07会被移除,字段内容变为11/14/2012 TD: telephone number added per telephone campaign 2012,其余字段完全不受影响,可正常解析。

补充说明
  • 不要尝试用XML转义规则处理这类控制字符,XML标准本身不支持识别这类字符,转义后依然会触发解析错误,预处理清洗是最稳妥的方案
  • 如果业务场景需要留存非法字符的排查痕迹,可以把sub()方法的第二个参数从空字符串替换为自定义占位符,比如[非法控制字符]
  • 该清洗逻辑通用,使用Python标准库xml.etree.ElementTree、lxml等其他XML解析库遇到同类报错时,都可以用同样的预处理方式解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:01:24