Frage

Ich versuche, in einer XML-Datei zu lesen, die wie diese

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

Der Punkt, dass das Problem aussieht schafft, ist die

Jos&eacute; A. Blakeley

Teil: Der Parser ruft seinen Charakter Handler zweimal, einmal mit "Jos", einmal mit "A. Blakeley". Jetzt verstehe ich, kann dies das richtige Verhalten, wenn es nicht die eacute Einheit nicht kennt. Dies wird jedoch in der dblp.dtd definiert, die ich habe. Ich scheine nicht in der Lage sein Expat zu überzeugen, diese Datei zu verwenden, though. Alles, was ich sagen kann, ist

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)

aber Expat immer noch nicht meine Einheit erkennen. Warum gibt es keine Möglichkeit, Expat zu erzählen, die DTD zu benutzen? Ich habe versucht,

  • Sie die Datei in das gleiche Verzeichnis wie die XML setzen
  • setzen Sie die Datei in das Arbeitsverzeichnis des Programms
  • die Bezugnahme in der XML-Datei mit einem absoluten Pfad

Was bin ich? Thx.

War es hilfreich?

Lösung

Wie ich es verstehe, wenn Sie pyexpat direkt verwenden, dann haben Sie Ihre eigene ExternalEntityRefHandler, um die externe DTD zu holen und ihn an Expat.

Siehe zB. xml.sax.expatreader beispielsweise Code (Methode external_entity_ref, Linie 374 in Python 2.6).

Es wäre wahrscheinlich besser, eine höhere Ebene zu verwenden Schnittstelle wie SAX (via expatreader), wenn Sie können.

Andere Tipps

btw kann ich mir vorübergehend helfen, durch Kopieren der relevanten Teile des .dtd in die XML-Datei selbst, wie in

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

, aber das ist wirklich nicht das Problem in allgemeiner Art und Weise zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top