У меня была похожая проблема, чтобы решить.Мне нужно было прочитать файл TEI XML, содержащий объекты типа
&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 спас мне день.