Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python.expat可以';t解析带有错误符号的XML文件。怎么走?_Python_Xml_Unicode_Expat Parser - Fatal编程技术网

Python.expat可以';t解析带有错误符号的XML文件。怎么走?

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错误,它们解析得很

我正在尝试用expat解析XML文件(OSM数据),expat无法解析带有某些Unicode字符的行:

<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++应用程序中(只有我们的一半),没有字符错误(文件解压缩)。你能在未压缩的文件上试一下吗?看看你是否有同样的错误?