У меня была аналогичная проблема, которую нужно было решить. Мне нужно было прочитать XML-файл TEI, содержащий такие объекты, как
&some_exotic_char;
которые были объявлены в отдельном файле DTD. Задача заключалась в том, чтобы добавить какой-либо атрибут в определенные теги и записать измененный файл, сохранив при этом специальные сущности и не испортив XML-макет.
BeautifulSoup работал хорошо, пока я не захотел снова записать XML-файл:
with open('outfile.xml','w') as outfile:
outfile.write(soup.prettify())
Тогда он не оставил бы сущности «как есть», а вместо этого расширил бы их до символов utf8, чего я не хотел. Кроме того, он испортил исходную разметку XML независимо от prettify-метода (без него еще хуже).
В конце концов я сдался и нашел хорошее решение с использованием Perl и XML::LibXML. Методом
$parser->expand_entities(0);
объекты не будут расширены. А запись XML обратно в файл сохранит исходный макет нетронутым.
use XML::LibXML;
my $parser = new XML::LibXML;
$parser->validation(0);
$parser->load_ext_dtd(1);
$parser->expand_entities(0);
my $doc = $parser->parse_file('infile.xml');
... # do whatever you need to do
open my $out, '>', 'outfile.xml';
binmode $out;
print $out $doc->toString();
close $out;
Perl XML::LibXML спас меня.
person
Swen Vermeul
schedule
13.06.2018
xml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVERв expat сделает это, но это не имело никакого эффекта. Чем он хорош, интересно. - person melissa_boiko   schedule 20.02.2013