Я искал много способов записи XML-файлов, таких как lxml, minidom и т. д. Однако ни один из них не делает то, что я хочу. Начну с нуля. Я выбрал xml.etree.ElementTree. Вот мой код
from xml.etree.ElementTree import Element, SubElement, ElementTree, tostring
from xml.dom import minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent = " ")
Clip = Element('Clip')
tree = ElementTree(Clip)
Header = SubElement(Clip, 'Header')
Filename = SubElement(Header, 'Filename')
Filename.text = "C001101_001.mp4"
Duration = SubElement(Header, 'Duration')
Duration.text = "00:07:13"
Alarms = SubElement(Clip, 'Alarms')
Alarm = SubElement(Alarms, 'Alarm')
StartTime = SubElement(Alarm, "StartTime")
StartTime.text = "00:03:27"
AlarmDescription = SubElement(Alarm, "AlarmDescription")
AlarmDescription.text = "Loitering"
AlarmDuration = SubElement(Alarm, "AlarmDuration")
AlarmDuration.text = "00:00:44"
print(prettify(Clip))
tree.write(open("obbo.xml", "wb"))
print(prettify(Clip)) выводит это на консоль
<?xml version = "1.0" ?>
<Clip>
<Header>
<Filename>C001101_001.mp4</Filename>
<Duration>00:07:13</Duration>
</Header>
<Alarms>
<Alarm>
<StartTime>00:03:27</StartTime>
<AlarmDescription>Loitering</AlarmDescription>
<AlarmDuration>00:00:44</AlarmDuration>
</Alarm>
</Alarms>
</Clip>
Я хочу записать файл obbo.xml как точно в виде печатной формы, tree.write(open("obbo.xml", "wb")) записывает, но в одной строке:
<Clip><Header><Filename>C001101_001.mp4</Filename><Duration>00:07:13</Duration></Header><Alarms><Alarm><StartTime>00:03:27</StartTime><AlarmDescription>Loitering</AlarmDescription><AlarmDuration>00:00:44</AlarmDuration></Alarm></Alarms></Clip>
Надеюсь, ты сможешь помочь ~
@MichaelButscher На данный момент это не проблема, я могу потом оптимизировать код, в любом случае спасибо
Уже ответил здесь stackoverflow.com/questions/749796/… с большим количеством перечисленных опций. В вашем случае вы можете просто сохранить вывод prettify(Clip) в файл вместо tree.write(...).
@Poolka, я это уже видел, они о печати, а не о записи нового файла в желаемом формате.
Прочтите Распечатать, как пользоваться file=...
@voo_doo Печать в консоль и запись в файл - это одна и та же операция на уровне, на котором вы используете функции print и write. Единственное отличие - место назначения - консоль или файл. В вашем коде prettify(Clip) дает вам довольно отформатированную строку. Используйте его как хотите - распечатайте на консоли или сохраните в файл. Связанный вопрос описывает несколько способов создания хорошо отформатированной строки XML-данных с помощью Python.
Отвечает ли это на ваш вопрос? Как мне заставить Python ElementTree красиво печатать в XML-файл?






Почему бы не использовать
prettifyв корневом элементе (ну, на самом деле вы это уже сделали) и не записать полученную строку в файл?