Я пытался разобрать файл с помощью 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-файл, содержащий этот узел и несколько его соседей, синтаксический анализ работает!
Это тоже не проблема с размером. Мне удалось без проблем разобрать файлы гораздо большего размера.
Есть идеи?