Python minidom нежелательные пробелы

Я использую Python для записи данных в файлы .xml. У меня есть этот файл с именем Statistics.xml, и каждый раз, когда я вызываю свой метод writeIntoXml(), он должен добавлять данные в этот xml-файл статистики. Теперь Python делает это отлично, единственная проблема заключается в том, что он добавляет нежелательные пробелы между всеми моими элементами, которые были в файле до того, как я записал в него новые данные. Нравится:

<AantalTicketsPerUur>
    <Dag datum="2012-03-16">
        <Aantal_tickets Aantal="24" uurinterval="0u-1u"/>
        <Aantal_tickets Aantal="68" uurinterval="1u-2u"/>
        <Aantal_tickets Aantal="112" uurinterval="2u-3u"/>
        <Aantal_tickets Aantal="98" uurinterval="3u-4u"/>
    </Dag>
</AantalTicketsPerUur>

становится таким (элементы без этого пробела между ними являются новыми данными):

<AantalTicketsPerUur>


    <Dag datum="2012-03-16">


        <Aantal_tickets Aantal="24" uurinterval="0u-1u"/>


        <Aantal_tickets Aantal="68" uurinterval="1u-2u"/>


        <Aantal_tickets Aantal="112" uurinterval="2u-3u"/>


        <Aantal_tickets Aantal="98" uurinterval="3u-4u"/>


    </Dag>


    <Dag datum="2012-03-16">
        <Aantal_tickets Aantal="24" uurinterval="0u-1u"/>
        <Aantal_tickets Aantal="68" uurinterval="1u-2u"/>
        <Aantal_tickets Aantal="112" uurinterval="2u-3u"/>
        <Aantal_tickets Aantal="98" uurinterval="3u-4u"/>
    </Dag>
</AantalTicketsPerUur>

Как я могу это решить? ПРИМЕЧАНИЕ. Я ИСПОЛЬЗУЮ метод .toprettyxml()

заранее спасибо


person Confituur    schedule 15.03.2012    source источник
comment
Отвечает ли это на ваш вопрос? Пустые строки при использовании minidom.toprettyxml   -  person Josh Correia    schedule 12.02.2020


Ответы (2)


Вы можете использовать toxml вместо toprettyxml, который не изменяет формат:

def write_xml(filename, dom):
    f = open(filename, "w")
    f.write(dom.toxml("utf-8"))
    f.close()
person unknown user    schedule 06.11.2012

Я согласен с ответом от 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 кстати. Вот tmp1.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 -->

... а вот и tmp2.xml (обычный tostring):

<?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'))
person Jon Coombs    schedule 01.02.2014
comment
И оба метода, похоже, непоследовательно создают новые строки (иногда как CR, а иногда как CR LF, также известные как \r или \r\n). Хорошей новостью является то, что вывод из toprettyxml() может быть прочитан обратно, а затем сохранен обратно с идентичным форматированием, что было бы здорово, если бы я мог жить с 3-4 пустыми строками, которые он хочет между каждым элемент - person Jon Coombs; 02.02.2014