Поскольку никто не пришел, чтобы ответить, мне потребовалось некоторое время, но у меня есть ответы и указания, если другие люди столкнутся с той же проблемой.
Я начал с исходного кода, который вы видите в вопросе, который не будет удалять старые элементы, и оставил очень некрасивую последнюю строку.
Обратите внимание: MY_XML = xml.etree.ElementTree.parse({PATH_OF_XML})
Если вы используете xml.etree.ElementTree, вы должны использовать remove ()
метод для удаления узла, но для этого требуется, чтобы у вас был родитель
ссылка на узел. Который я называю elem.remove(child)
[строка 9]
Итак, почему они не удаляются? Я обнаружил, что изменение
Объект, который вы перебираете, влияет на итерацию. Это не
совершенно неожиданно, это то же самое, если вы измените список в то время как
перебирая это. Я так и не смог хранить информацию и
удалить элементы за одну итерацию.
Мне пришлось разделить задачу:
group_list = MY_XML.findall(".//group") # I do this because the actual xml is bigger with several groups
text_list = []
for group in group_list:
string_text = ""
for child in group :
for super_child in child:
if(super_child.text is not None): #Just in case None value because I cannot use string addition
string_text = string_text + super_child.text + " "
text_list.append(string_text) #I stored all the info in 1 group as a value in this list because like I stated my overall xml might be bigger with more than 1 group
for group in group_list:
for elem in group.findall(".//group_info"):
#loop over all possible <group> and removes all <group_info> inside
group.remove(elem)
#And finally to append the information gathered:
for group in group_list:
Text_elem = ET.Element("Text")
Text_elem.text = text_list[group_list.index(group)]
group_info_elem = ET.Element("Kundenhinweis_redigiert")
group_info_elem.append(Text_elem)
group.append(Kund_elem)
Это оставило меня с таким ужасным выводом:
<group>
<group_info><Text>Text1 Text2 Text3</Text></group_info></group>
, который легко решается с помощью модуля xml.dom.minidom
. Я начал с определения:
def prettify(elem):
rough_string = xml.etree.ElementTree.tostring(elem, 'utf-8')
reparsed = xml.dom.minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
Для вызова функции:
root = MY_XML.getroot()
pretty_xml = prettify(root)
#Next line is optional, but sometimes your string contains empty lines or lines with white spaces and/or breaklines
pretty_xml = "\n".join([s for s in pretty_xml.split("\n") if not s.isspace()])
print(pretty_xml)
Вывод будет:
<group>
<group_info>
<Text>Text1 Text2 Text3</Text>
</group_info>
</group>
Надеюсь, это поможет другим новичкам.