Это сводится к ~ 3 шага:
- получить элементы, которые соответствуют вашим критериям (Тэг == х, родительский тег == у)
- удалить этот элемент из родительского, поставив новый ребенок в этом месте
- Добавить бывшего ребенка к новому ребенку.
Для первого шага мы можем использовать this answer. Поскольку мы знаем, что нам понадобится родитель позже, давайте продолжим это в нашем поиске.
def find_elements(tree, child_tag, parent_tag):
parent_map = dict((c, p) for p in tree.iter() for c in p)
for el in tree.iter(child_tag):
parent = parent_map[el]
if parent.tag == parent_tag:
yield el, parent
шаги два и три очень взаимосвязаны, мы можем сделать их вместе.
def insert_new_els(tree, child_tag, parent_tag, new_node_tag):
to_replace = list(find_elements(tree, child_tag, parent_tag))
for child, parent in to_replace:
ix = list(parent).index(child)
new_node = ET.Element(new_node_tag)
parent.insert(ix, new_node)
parent.remove(child)
new_node.append(child)
Ваше дерево будет изменено на месте. Теперь использование просто:
tree = ET.parse('some_file.xml')
insert_new_els(tree, 'config', 'data', 'type')
tree.write('some_file_processed.xml')
непроверенных
«под тэгом данных» - Вы имеете в виду прямые дети, или бы, «внуком» по-прежнему быть подобран? – mgilson
прямые дети под тегами данных. – user3711096
и какой код вы уже пробовали? –