2013-09-17 2 views
1

Мне нужно проанализировать 1,2-гигабайтный XML-файл с кодировкой «ISO-8859-1», и после прочтения нескольких статей в NET кажется, что iterparse ElementTree Python() является предпочтительным для анализа SAX.ElementTree's iterparse() Ошибка синтаксического анализа XML

Я написал очень короткий фрагмент кода, чтобы проверить его, но он вызывает ошибку, которую я не знаю, как решить.

Мой код (Python 2.7):

from xml.etree.ElementTree import iterparse 

for (event, node) in iterparse('dblp.xml', events=['start']): 
    print node.tag 
    node.clear() 

Edit: Ааа, так как файл был действительно большой и лага, я напечатал в XML-строку, и сделал ошибку. Это «& uuml;» без пространства. Прошу прощения за это.

Этот код работает отлично, пока не достигнет строки в файле XML, который выглядит следующим образом:

<Journal>Technical Report 248, ETH Z&uuml;rich, Dept of Computer Science</Journal> 

который я предполагаю, означает Цюрих, но анализатор, кажется, не знают.

Выполнение кода выше дал мне ошибку:

xml.etree.ElementTree.ParseError: undefined entity &uuml; 

есть в любом случае я мог бы решить эту проблему? Я разработал множество решений, но никто, похоже, не справляется с этой проблемой напрямую.

+0

Хорошо, у вас есть inconsistancy, что нужно разрешение. В XML есть '& umml', а в ошибке у вас' & uuml'. Если они оба являются '& umml', это потому, что XML недействителен и требует исправления. Если они оба '& uuml', что * есть * определенный объект, то он должен работать. Если они действительно разные, вам нужно предоставить дополнительную информацию о файле. –

ответ

1

Попробуйте следующее:

from xml.etree.ElementTree import iterparse, XMLParser 
import htmlentitydefs 

class CustomEntity: 
    def __getitem__(self, key): 
     if key == 'umml': 
      key = 'uuml' # Fix invalid entity 
     return unichr(htmlentitydefs.name2codepoint[key]) 

parser = XMLParser() 
parser.parser.UseForeignDTD(True) 
parser.entity = CustomEntity() 

for (event, node) in iterparse('dblp.xml', events=['start'], parser=parser): 
    print node.tag 
    node.clear() 

ИЛИ

from xml.etree.ElementTree import iterparse, XMLParser 
import htmlentitydefs 

parser = XMLParser() 
parser.parser.UseForeignDTD(True) 
parser.entity = {'umml': unichr(htmlentitydefs.name2codepoint['uuml'])} 

for (event, node) in iterparse('dblp.xml', events=['start'], parser=parser): 
    print node.tag 
    node.clear() 

Связанный вопрос: Python ElementTree support for parsing unknown XML entities?

+0

Не знаете, почему это принятый ответ; OP утверждает, что это 'uuml', а не' umml' ... –

+0

@ Clément, см. историю изменений вопроса. – falsetru

+0

Я видел это; Я просто задаюсь вопросом, почему это принятый ответ, учитывая, что он не отвечает на вопрос в его нынешней форме. –

Смежные вопросы