Получение экспата для использования.dtd для замены сущности в python
Я пытаюсь прочитать в XML-файл, который выглядит так
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>José A. Blakeley</author>
</incollection>
</dblp>
Точка, которая создает проблему выглядит
José 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 "À" >
]>
но это не решает проблему в целом.