【发布时间】:2011-12-03 08:35:34
【问题描述】:
我一直在尝试用xml.etree.ElementTree解析一个文件:
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ParseError
def analyze(xml):
it = ET.iterparse(file(xml))
count = 0
last = None
try:
for (ev, el) in it:
count += 1
last = el
except ParseError:
print("catastrophic failure")
print("last successful: {0}".format(last))
print('count: {0}'.format(count))
这当然是我的代码的简化版本,但这足以破坏我的程序。如果我删除 try-catch 块,我会在某些文件中收到此错误:
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
from yparse import analyze; analyze('file.xml')
File "C:\Python27\yparse.py", line 10, in analyze
for (ev, el) in it:
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1258, in next
self._parser.feed(data)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1624, in feed
self._raiseerror(v)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1488, in _raiseerror
raise err
ParseError: reference to invalid character number: line 1, column 52459
结果是确定性的,如果文件有效,它将始终有效。如果文件失败,它总是失败并且总是在同一点失败。
最奇怪的是我正在使用跟踪来查明是否有任何格式错误的 XML 破坏了解析器。然后我隔离导致故障的节点。但是当我创建一个包含该节点和它的一些邻居的 XML 文件时,解析就可以了!
这似乎也不是尺寸问题。我已经成功地解析了更大的文件。
有什么想法吗?
【问题讨论】:
-
您必须展示一些有问题的 XML。有可能您的 XML 不好,然后当您对其进行编辑以缩小范围时,它就变成了好的 XML。编辑可以做鬼鬼祟祟的事情……
-
@NedBatchelder 文件很大,上传起来很困难。不过,我确实考虑过这种可能性。所以我直接使用 Python 的文件操作函数来提取部分 XML 并将它们写入另一个文件。
-
你能显示导致这种情况的任何 XML 吗?
-
@pessimopoppotamus:根据您的错误消息,错误仅在文件中发生 52KB ...
-
@NedBatchelder 我正在开发一个 XML 分块器,它可以生成有效的 XML 块,直到达到一定的块大小。我将尝试使用它来生成失败的 XML 并上传。