我有一些python代码处理输入文件并将某些字段从输入转储到XML文件。从输入传递空字符时,此代码中断 - 抛出无效的令牌错误:
def pretty_print_xml(elem):
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=' ')
这令我感到惊讶,我想知道为什么它会破坏,还有什么可能需要从输入中消毒。我认为只有一个XML元字符可能会抛出这个错误,而这些错误已经由minidom处理了。
答案 0 :(得分:1)
XML中不允许使用NUL文字。见the XML standard, version 1.1:
2.2字符
[定义:解析后的实体包含文本,characters的序列,可以表示标记或字符数据。] [定义:字符是ISO / IEC 10646 {{ 3}}。合法字符包括制表符,回车符,换行符以及Unicode和ISO / IEC 10646的合法字符。[ISO/IEC 10646]中引用的这些标准的版本在编写本文档时是最新的。可以通过修订或新版本将新字符添加到这些标准中。因此,XML处理器必须接受为A.1 Normative References指定的范围内的任何字符。]
[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ [2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
请注意Char
被定义为允许(在其他范围内)\x01
到\xD7FF
- 但不 \x00
。
顺便说一句 - 如果您的目标是漂亮打印,我建议使用lxml.etree
。如果序列化调用上的Char无法开箱即用,请参阅the pretty_print=True
argument。