Domanda

Sto cercando di leggere in un file XML che assomiglia a questo

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>Jos&eacute; A. Blakeley</author>
</incollection>
</dblp>

Il punto che crea gli sguardi problema è il

Jos&eacute; A. Blakeley

parte: Il parser chiama il suo gestore di carattere per due volte, una volta con "Jos", una volta con "A. Blakeley". Ora ho capito questo può essere il comportamento corretto, se non conosce l'entità eacute. Tuttavia, questo è definito nel dblp.dtd, che ho. Non mi sembra di essere in grado di convincere expat utilizzare questo file, però. Tutto quello che posso dire è

p = xml.parsers.expat.ParserCreate()
# tried with and without following line
p.SetParamEntityParsing(xml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS) 
p.UseForeignDTD(True)
f = open(dblp_file, "r")
p.ParseFile(f)

ma expat ancora non riconosce la mia entità. Perché non c'è modo per dire che expat DTD da usare? Ho provato

  • mettere il file nella stessa directory del XML
  • mettere il file nella directory di lavoro del programma
  • sostituendo il riferimento nel file XML da parte di un percorso assoluto

Che cosa mi manca? Thx.

È stato utile?

Soluzione

Da quanto ho capito, se si sta utilizzando pyexpat direttamente, quindi è necessario fornire il proprio ExternalEntityRefHandler a prendere il DTD esterno e dei mangimi per expat.

vedi ad es. xml.sax.expatreader per esempio di codice (metodo external_entity_ref, linea 374 in Python 2.6).

Probabilmente sarebbe meglio usare un più alto livello di interfaccia, come SAX (via expatreader), se possibile.

Altri suggerimenti

btw posso temporaneamente aiutare me stesso copiando le parti pertinenti della .dtd nel file XML stesso, come in

<!DOCTYPE dblp [
    <!ENTITY Agrave  "&#192;" >
]>

, ma che in realtà non risolvere il problema in modo generale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top