Я согласен с ответом от qgi. Но обратите внимание, что эти два метода, кажется, имеют противоположные особенности в отношении комментариев, найденных ВНЕ корневого элемента. Например, если я проанализирую этот XML-файл с помощью minidom ...
<?xml version="1.0" encoding="utf-8"?>
<!-- testing 1 -->
<!-- testing 2 -->
<sources autodelete="false" syncmedia="true" multivalue_separator=";; ">
<!-- testing 3 -->
<source
id_field="Lex GUID"
source_audio_folder="samples/audio"
source_image_folder="samples/pictures" >
<source_field anki_field="Lex GUID" />
</source>
<!-- Test blah blah
blah blah
blah
-->
<source
id_field="Example"
source_audio_folder="samples/audio"
source_image_folder="samples/pictures" >
<source_field anki_field="Example" />
</source>
</sources>
<!-- test THE END -->
... и затем я сохраняю его как два разных файла, toxml сохраняет эти внешние части красиво (но ничего внутри корня), а toprettyxml сохраняет только части внутри корня. Я использую Python 2.7 BTW. Вот tmp1.xml ('pretty'):
<?xml version="1.0" encoding="utf-8"?><!-- testing 1 --><!-- testing 2 --><sources autodelete="false" multivalue_separator=";; " syncmedia="true">
<!-- testing 3 -->
<source id_field="Lex GUID" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
<source_field anki_field="Lex GUID"/>
</source>
<!-- Test blah blah
blah blah
blah
-->
<source id_field="Example" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
<source_field anki_field="Example"/>
</source>
</sources><!-- test THE END -->
... а вот tmp2.xml (обычная строка):
<?xml version="1.0" encoding="utf-8"?>
<!-- testing 1 -->
<!-- testing 2 -->
<sources autodelete="false" multivalue_separator=";; " syncmedia="true">
<!-- testing 3 -->
<source id_field="Lex GUID" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
<source_field anki_field="Lex GUID"/>
</source>
<!-- Test blah blah
blah blah
blah
-->
<source id_field="Example" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
<source_field anki_field="Example"/>
</source>
</sources>
<!-- test THE END -->
На всякий случай, вот код Python, который произвел эти:
import xml.dom.minidom as minidom
tree = minidom.parse(file_path)
s1 = tree.toxml('utf-8')
s2 = tree.toprettyxml(' ', '\n', 'utf-8')
with open ('tmp1.xml', mode='w') as outfile: # Python 3 would also allow: encoding='utf-8'
outfile.write(s1.encode('utf-8'))
with open ('tmp2.xml', mode='w') as outfile:
outfile.write(s2.encode('utf-8'))