Я пытаюсь добавить элементы в существующий .xml, используя ElementTree.
У меня есть нужные атрибуты, хранящиеся в виде списка словарей:
myDict = [{"name": "dan",
"age": "25",
"subject":"maths"},
{"name": "susan",
"age": "27",
"subject":"english"},
{"name": "leo",
"age": "24",
"subject":"psychology"}]
И я использую следующий код для добавления:
import xml.etree.ElementTree as ET
tree = ET.parse('<path to existing .xml')
root = tree.getroot()
for x,y in enumerate(myDict):
root.append(ET.Element("student", attrib=myDict[x]))
tree.write('<path to .xml>')
В основном это работает нормально, за исключением того, что все элементы добавляются в виде одной строки. Я хотел бы, чтобы каждый элемент добавлялся в новую строку:
# Not this:
<student name='dan' age='25' subject='maths' /><student name='susan' age='27' subject='english' /><student name='leo' age='24' subject='psychology' />
# But this:
<student name='dan' age='25' subject='maths' />
<student name='susan' age='27' subject='english' />
<student name='leo' age='24' subject='psychology' />
Я попытался использовать lxml
и передать аргумент pretty_print=True
в вызове tree.write
, но это не дало никакого эффекта.
Я уверен, что мне не хватает чего-то простого, поэтому ваша помощь приветствуется!
Итак, согласно этому, я добавляю tail = "\n"
при назначении атрибутов? root.append(ET.Element("student", attrib=myDict[x], tail='\n'))
. Я должен ошибаться, кажется, не работает.
НВМ. Сортировал. Добавлю свои изменения в качестве ответа для ясности. Спасибо за указатель @Thicc_Gandhi
Вы пробовали indent()
? stackoverflow.com/a/68618047/407651
С указателями из здесь (спасибо @Thicc_Gandhi), я решил это, изменив итерацию на:
for x,y in enumerate(MyDict):
elem = ET.Element("student",attrib=myDict[x])
elem.tail = "\n"
root.append(elem)