Прочитать файл XML построчно, внести изменения

mpd = ''
file1 = open("/manifest.mpd", "r", encoding = "utf-8")
while True:
    line = file1.readline() # считываем строку
    if not line: break # прерываем цикл, если строка пустая
    if line.strip() == '</Period>':
        mpd += f'       <AdaptationSet id="1" mimeType="image/webp" contentType="image">\n'
        mpd += '        </AdaptationSet>\n'
    mpd += line
file1.write(mpd)   
#print(mpd)
file1.close()

Все не то, необходимо прочитать файл mpd, найти вхождение , добавить пару строк передним и сохранить в этом же файле. Находим, добавляем, а сохранить не удается. Все режимы перепробовал, либо ошибка, либо пустой файл по итогу

Как это лучше всего сделать?

**************

Пытаюсь разобраться как работать с xml.etree.ElementTree

tree = ET.parse('/manifest.mpd')
root = tree.getroot()
new_elem = ET.Element('new_tag')
new_elem.set('attribute_name', 'attribute_value')
new_elem.text = 'element_tesssssssxt'
root.findall('AdaptationSet').append(new_elem)

Не понимаю, читает, изменяет..

Допустим необходимо добавить строчку, добавить после последнего элемента AdaptationSet

Как это можно сделать, может ли добавлять строчки? После сохранения, все теги начинаются с ns0:

root.find("{urn:mpeg:dash:schema:mpd:2011}AdaptationSet")

Не работает


Ответы (1 шт):

Автор решения: Alex Titov

Поставьте lxml, код примерно такой.

import lxml.etree as ET
tree = ET.parse('manifest.mpd')
root = tree.getroot()
new_elem = ET.Element('new_tag')
new_elem.set('attribute_name', 'attribute_value')
new_elem.text = 'element_tesssssssxt'
# '*/' - чтобы искать во всех дочерних элементах, а не только в текущем
# [-1] - чтобы добавить за последним элементом
# addnext - если надо добавить именно после (append добавит "внутрь")
root.findall('*/{urn:mpeg:dash:schema:mpd:2011}AdaptationSet')[-1].addnext(new_elem)
tree.write('manifest1.mpd', pretty_print=True, xml_declaration=True)
→ Ссылка