Получение экспата для использования.dtd для замены сущности в python

Я пытаюсь прочитать в XML-файл, который выглядит так

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

Точка, которая создает проблему выглядит

Jos&eacute; A. Blakeley

part: парсер вызывает свой обработчик символов дважды, один раз с "Jos", один раз с "A. Blakeley". Теперь я понимаю, что это может быть правильным поведением, если оно не знает сущность eacute. Тем не менее, это определено в dblp.dtd, который у меня есть. Похоже, я не могу убедить экспата использовать этот файл. Все, что я могу сказать, это

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)

но эмигрант все еще не распознает мою сущность. Почему нет способа сообщить экспату, какой DTD использовать? я пробовал

  • положить файл в тот же каталог, что и XML
  • положить файл в рабочий каталог программы
  • замена ссылки в файле XML на абсолютный путь

Что мне не хватает? Спасибо.

2 ответа

Решение

Насколько я понимаю, если вы используете pyexpat напрямую, то вы должны предоставить свой собственный ExternalEntityRefHandler получить внешний DTD и передать его экспату.

См. Например xml.sax.expatreader например код (метод external_entity_refстрока 374 в Python 2.6).

Вероятно, было бы лучше использовать интерфейс более высокого уровня, такой как SAX (через expatreader) если ты можешь.

Кстати, я могу временно помочь себе, скопировав соответствующие части.dtd в сам файл XML, как в

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

но это не решает проблему в целом.

Другие вопросы по тегам