Почему ElementTree вызывает ошибку ParseError?

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

Это тоже не проблема с размером. Мне удалось без проблем разобрать файлы гораздо большего размера.

Есть идеи?

11
задан Aillyn 8 October 2011 в 00:30
поделиться