2010-05-14 13 views
2

j'utilise lxml comme suit pour analyser un fichier XML exporté d'un autre système:lxml entité unicode parse problèmes

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

Mais im obtenir:

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

De toute évidence, il a des problèmes avec l'entité unicode noms - mais comment pourrais-je contourner cela? Via open() ou parse()?

Edit: j'avais oublié d'inclure ma DTD dans le même dossier - il est là maintenant et a la déclaration suivante:

<!ENTITY eacute "&#233;"> 

et est appelé (et a toujours été) en xmldoc comme si:

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

Pourtant, j'ai toujours le même problème ... la DTD doit-elle être déclarée aussi en Python?

Répondre

6

eacute n'est pas une entité prédéfinie en XML. Pour inclure une référence d'entité &eacute; dans un fichier XML, une déclaration <!DOCTYPE> doit pointer vers une DTD (telle qu'une DTD XHTML 1.0) qui définit l'entité.

Si le fichier XML utilise &eacute; mais n'a pas de <!DOCTYPE>, il n'est pas correctement formé et le système qui l'a exporté doit être corrigé.

(Il n'y a pas une bonne raison d'utiliser une référence d'entité pour représenter é dans un fichier XML. La référence de caractère &#233; est entendu partout sans définitions d'entité, si le fichier ne peut pas inclure simplement une UTF-8 premières é pour une raison quelconque.)

+0

J'ai essayé d'ajouter le dtd, le fichier, mais pas le doctype, qui manquait. Mais j'ai toujours la même erreur. –

+0

Assurez-vous que vous utilisez 'etree.XMLParser (load_dtd = True)' (passé à 'etree.parse()') pour qu'il utilise réellement la DTD. – bobince