получение экспата для использования .dtd для замены сущности в python - PullRequest
1 голос
/ 21 мая 2010

Я пытаюсь прочитать в 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-файле на абсолютный путь

Чего мне не хватает? Thx.

Ответы [ 2 ]

1 голос
/ 21 мая 2010

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

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

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

0 голосов
/ 21 мая 2010

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

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

но это не решает проблему в общем виде.

...