Python.expat可以';t解析带有错误符号的XML文件。怎么走?
我正在尝试用expat解析XML文件(OSM数据),expat无法解析带有某些Unicode字符的行:Python.expat可以';t解析带有错误符号的XML文件。怎么走?,python,xml,unicode,expat-parser,Python,Xml,Unicode,Expat Parser,我正在尝试用expat解析XML文件(OSM数据),expat无法解析带有某些Unicode字符的行: <tag k="name" v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" /> <tag k="name" v="Cin\x8e? Rex" /> (开头行中的XML文件编码为“UTF-8”) 文件很旧,一定有错误。在现代文件中,我看不到UTF-8错误,它们解析得很
<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />
<tag k="name" v="Cin\x8e? Rex" />
(开头行中的XML文件编码为“UTF-8”)
文件很旧,一定有错误。在现代文件中,我看不到UTF-8错误,它们解析得很好。但是,如果我的程序遇到一个损坏的符号,我可以采取什么解决方法呢?是否可以加入bz2编解码器(我解析压缩文件)和utf-8编解码器以忽略断开的字符,或者将它们更改为“?”?不确定是否�' 字符是通过复制粘贴字符串引入的, 但如果原始数据中有它们,那么它似乎是生成器 引入\uFFFD特征的问题如下: “用于替换值未知或未知的传入字符 在Unicode中不可表示” 从以下地点登记: 解决办法?只是扩展的想法:
good = True
buf = None
while True:
if good:
buf = f.read(buf_size)
else:
# try again with cleaned buffer
pass
try:
xp.Parse(buf, len(buf) == 0)
if (len(buf) == 0):
break
good = True
except ExpatError:
if xp.ErrorCode == XML_ERROR_BAD_CHAR_REF:
# look at ErrorByteIndex (or nearby)
# for 0xEF 0xBF 0xBD (UTF8 replacement char) and remove it
good = False
else:
# other errors processing
pass
或者清除输入缓冲区+角盒(缓冲区端的部分序列)。
我记不起python的expat是否允许分配自定义错误处理程序。
那就容易多了
如果我把你的样品从�' 字符处理好了。
\xd1不会失败
OSM数据?字符集听起来像什么,它是OSM全地球垃圾场。我将尝试为您的代码生成一个生成器,谢谢!我注意到xp.ErrorCode包含一个数字代码,但是XML\u ERROR\u BAD\u CHAR\u REF包含一个字符串(Python 2.6)。如果我想检查错误类型,那将是一个相当头疼的问题:我需要比较字符串,等等。。。这是行不通的:当expat引发错误时,它已经吃掉了最多的字符,而且我看不到在
buf
中获取错误字符索引的方法。只有lineno
和columnno
和字符计数器可以计算文件中的所有字符,但不能计算buf
中的所有字符。因此,请尝试我发布的另一个内容。读取后清除缓冲区。还要检查缓冲区结束部分序列,如果是:将该部分移到“提醒”存储器中,该存储器将与下一个读取的缓冲区合并。还有一件事:让你的输入数据�' 角色,还是外派人员报道其他事情?我已经用ExpAT2.0.1检查了我的PLANET100129OSM,但是在C++应用程序中(只有我们的一半),没有字符错误(文件解压缩)。你能在未压缩的文件上试一下吗?看看你是否有同样的错误?