Как добавить элемент в xml файл с помощью elementtree

У меня есть xml файл, и я пытаюсь добавить к нему дополнительный элемент. xml имеет следующую структуру:

<root>
  <OldNode/>
</root>

Я ищу:

<root>
  <OldNode/>
  <NewNode/>
</root>

но на самом деле я получаю следующий xml:

<root>
  <OldNode/>
</root>

<root>
  <OldNode/>
  <NewNode/>
</root>

Мой код выглядит следующим образом:

file = open("/tmp/" + executionID +".xml", 'a')
xmlRoot = xml.parse("/tmp/" + executionID +".xml").getroot()

child = xml.Element("NewNode")
xmlRoot.append(child)

xml.ElementTree(root).write(file)

file.close()

Спасибо.

Ответ 1

Вы открыли файл для добавления, который добавляет данные в конец. Вместо этого откройте файл для записи, используя режим w. Еще лучше, просто используйте метод .write() для объекта ElementTree:

tree = xml.parse("/tmp/" + executionID +".xml")

xmlRoot = tree.getroot()
child = xml.Element("NewNode")
xmlRoot.append(child)

tree.write("/tmp/" + executionID +".xml")

Использование метода .write() имеет дополнительное преимущество в том, что вы можете установить кодировку, заставить пролог XML быть написаны, если вам это нужно, и т.д.

Если вы должны использовать открытый файл для префикса XML, используйте режим 'w', 'a' открывает файл для добавления, приводя к наблюдаемому поведению:

with open("/tmp/" + executionID +".xml", 'w') as output:
     output.write(prettify(tree))

где prettify есть что-то вроде:

from xml.etree import ElementTree
from xml.dom import minidom

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = ElementTree.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="  ")

например. миниатюрный притворный трюк.