Pregunta

Estoy tratando de leer en un archivo XML que se parece a esto

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

El punto que crea la apariencia de problemas es la

Jos&eacute; A. Blakeley

parte: El analizador llama a su manejador personaje dos veces, una vez con "José", una vez con "A. Blakeley". Ahora entiendo puede ser el comportamiento correcto si no conoce la entidad eacute esto. Sin embargo, esto se define en el dblp.dtd, lo que tengo. No parecen ser capaces de convencer expatriados a utilizar este archivo, sin embargo. Todo lo que puedo decir es

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)

expatriado pero todavía no reconoce mi entidad. Por qué no hay manera de saber de expatriados, que DTD a utilizar? He intentado

  • poner el archivo en el mismo directorio que el XML
  • poner el archivo en el directorio de trabajo del programa
  • sustitución de la referencia en el archivo XML por una ruta absoluta

¿Qué me falta? THX.

¿Fue útil?

Solución

A mi entender, si está usando pyexpat directamente, entonces usted tiene que proporcionar su propia ExternalEntityRefHandler a buscar el DTD externa y alimentar a expatriados.

Véase, por ejemplo. xml.sax.expatreader por ejemplo código (método external_entity_ref, la línea 374 en Python 2.6).

Probablemente sería mejor utilizar una interfaz de alto nivel tales como SAX (a través de expatreader) si es posible.

Otros consejos

por cierto me puede ayudar temporalmente a mí mismo copiando las partes pertinentes de la .dtd en el archivo XML en sí, como en

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

pero que en realidad no resolver el problema de una manera general.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top