Я адаптирую следующий код (созданный с помощью совета в этот вопрос ), который взял файл XML и его DTD и преобразовал их в другой формат.Для этой проблемы важен только раздел загрузки:
xmldoc = open(filename)
parser = etree.XMLParser(dtd_validation=True, load_dtd=True)
tree = etree.parse(xmldoc, parser)
Это работало нормально при использовании файловой системы, но я конвертирую ее для запуска через веб-фреймворк, где два файла загружаются черезform.
Загрузка xml-файла работает нормально:
tree = etree.parse(StringIO(data['xml_file'])
Но поскольку DTD связан с верхней частью xml-файла, следующий оператор завершается неудачно:
parser = etree.XMLParser(dtd_validation=True, load_dtd=True)
tree = etree.parse(StringIO(data['xml_file'], parser)
Через этот вопрос , я пытался:
etree.DTD(StringIO(data['dtd_file'])
tree = etree.parse(StringIO(data['xml_file'])
В то время как первая строка не вызывает ошибку, вторая падает на юникодные объекты, которые DTD должен подобрать(и делает это в версии файловой системы):
XMLSyntaxError: Объект 'eacute' не определен, строка 4495, столбец 46
Как правильно выполнить загрузкуэто DTD?