如何使用xmltodict.parse处理不可打印数据?
处理含不可打印字符的XML(基于xmltodict)
你遇到的ExpatError是因为XML 1.0标准禁止包含大部分ASCII控制字符(比如你的代码里的\x08退格符),而xmltodict默认使用的expat解析器严格遵循XML 1.0规范,所以会报错。下面提供两种解决方案:
方案一:预处理XML,过滤非法控制字符
如果不需要保留这些不可打印字符,可以先清理XML字符串,仅保留XML 1.0允许的控制字符(\t、\n、\r),移除其余非法控制字符:
import xmltodict import re def clean_invalid_xml_chars(xml_str): # 正则匹配并移除所有XML 1.0禁止的控制字符 return re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', xml_str) # 原始XML字符串 raw_xml = '<a>as\x08</a>' # 清理后解析 cleaned_xml = clean_invalid_xml_chars(raw_xml) result = xmltodict.parse(cleaned_xml) print(result) # 输出: {'a': 'as'}
方案二:切换到XML 1.1模式解析(保留不可打印字符)
如果需要完整保留原始的不可打印字符,可以自定义expat解析器,切换到XML 1.1模式(该标准允许更多控制字符),再传给xmltodict:
import xmltodict import xml.parsers.expat # 创建遵循XML 1.1规范的expat解析器 parser = xml.parsers.expat.ParserCreate() parser.xml_version = "1.1" # 使用自定义解析器解析XML raw_xml = '<a>as\x08</a>' result = xmltodict.parse(raw_xml, expat=parser) print(result) # 输出: {'a': 'as\x08'}
内容的提问来源于stack exchange,提问作者python3.789
相关产品推荐
相关产品推荐

