2015-03-18 1 views
0
I have the following structure 

<root> 
    <data> 
    <config> 
     CONFIGURATION 
    <config> 
    </data> 

</root> 

С модулем ElementTree Python, я хочу, чтобы добавить родительский элемент <config> тега вДобавления родительского тега к вложенной структуре с ElementTree (Python)

<root> 
    <data> 
    <type> 
     <config> 
     CONFIGURATION 
     <config> 
    </type> 
    </data> 

</root> 

Также файл XML может иметь другие тег конфигурации в другом месте, но меня интересуют только те, которые появляются под тегом данных.

+0

«под тэгом данных» - Вы имеете в виду прямые дети, или бы, «внуком» по-прежнему быть подобран? – mgilson

+0

прямые дети под тегами данных. – user3711096

+0

и какой код вы уже пробовали? –

ответ

1

Это сводится к ~ 3 шага:

  1. получить элементы, которые соответствуют вашим критериям (Тэг == х, родительский тег == у)
  2. удалить этот элемент из родительского, поставив новый ребенок в этом месте
  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') 

непроверенных

+0

Это действительно отличный ответ – user3711096

 Смежные вопросы

  • Нет связанных вопросов^_^