2010-05-14 4 views
2

Я использую LXML следующим образом разобрать экспортированный файл XML из другой системы:LXML проблемы юникода сущность синтаксического анализа

xmldoc = open(filename) 
etree.parse(xmldoc) 

Но им получить:

lxml.etree.XMLSyntaxError: Entity 'eacute' not defined, line 4495, column 46

Очевидно, что это возникают проблемы с юникода лица имена - но как мне обойти это? Через open() или parse()?

Edit: я забыл включить мой ОТД в той же папке - это там сейчас и имеет следующее заявление:

<!ENTITY eacute "&#233;"> 

и называется (и всегда был) в xmldoc, как так:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE DScribeDatabase SYSTEM "foo.dtd"> 

Но у меня все еще такая же проблема ... нужно ли DTD также объявлять на Python?

ответ

6

eacute не является предопределенным объектом в XML. Чтобы включить ссылку на объект &eacute; в файл XML, он должен иметь объявление <!DOCTYPE>, указывающее на DTD (например, DTD XHTML 1.0), который определяет объект.

Если XML использует &eacute;, но не имеет <!DOCTYPE>, он не имеет правильной формы и система, экспортирующая его, должна быть исправлена.

(Существует не очень хорошая причина, чтобы использовать ссылку на сущность представлять é в файле XML. Упоминание характера &#233; понимается везде без определений сущностей, если файл не может просто включать сырые UTF-8 é по какой-то причине.)

+0

Я пробовал добавить файл dtd, файл, но не doctype, для которого не хватало. Но я все равно получаю ту же ошибку. –

+0

Убедитесь, что вы используете 'etree.XMLParser (load_dtd = True)' (переданный в 'etree.parse()'), чтобы фактически использовать DTD. – bobince

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