2013-05-07 2 views
1

Мне нужно объединить несколько XML-файлов в один. Кроме того, структура нового файла отличается. Это моя «старая» структура:Python ElementTree Copy Node with childs

<a> 
    <b> 
     <c>1</c> 
     <c></c> 
     <c></c> 
     <c></c> 
    </b>  
    <b> 
     <c>1</c> 
     <c></c> 
     <c></c> 
     <c></c> 
    </b>   
    <b> 
     <c>2</c> 
     <c></c> 
     <c></c> 
     <c></c> 
    </b>  
</a> 

Это должно быть новым:

<a> 
<1> 
    <b> 
     <c>1</c> 
     <c></c> 
     <c></c> 
     <c></c> 
    </b> 
    <b> 
     <c>1</c> 
     <c></c> 
     <c></c> 
     <c></c> 
    </b> 
</1> 
<2> 
    <b> 
     <c>2</c> 
     <c></c> 
     <c></c> 
     <c></c> 
    </b> 
</2> 

Так мне нужна функция, которая может скопировать б-элемент, и это Чайлдс. Я не хочу использовать for-Loops для этого. Или это правильный путь?

+0

'<1/> и' <2/> 'является недопустимым элементом имена. –

+1

Да, я испортил это. Это было просто для демонстрации .. – Leagis

ответ

2

Возможно, вам действительно нужна копия? Будет ли реорганизация дерева достаточной?

import xml.etree.ElementTree as ET 

list_of_files = ["tree1.xml", "tree2.xml", ...] 

new_tree = ET.Element("a") 
i = 1 
for file in list_of_files: 
    original_tree = ET.parse(file) 
    sub_tree = ET.SubElement(new_tree, str(i)) 
    i += 1 
    sub_tree.append (original_tree) 
new_tree.write("merged_tree.xml") 
+0

Да Мне нужна копия, потому что я буду использовать оригинальный xml для других вещей. – Leagis

+2

Так что вызова copy.deepcopy должно быть достаточно. 'sub_tree.append (copy.deepcopy (original_tree))' в этом случае. –

+0

Но как копировать без дочерних узлов. Как '.append()' копировать узел вместе с ним дочерние узлы. Итак, как сделать обратное? – 2015-11-10 17:01:28

0

Для справок в будущем.

Простейший способом скопировать узел (или дерево) и держать его ребенок, без необходимости импорта ДРУГОГО библиотеки ТОЛЬКО для этого:

import xml.etree.ElementTree;  

def copy_tree(tree_root): 
    return et.ElementTree(tree_root); 

duplicated_node_tree = copy_tree (node); # type(duplicated_node_tree) is ElementTree 
duplicated_tree_root_element = new_tree.getroot(); # type(duplicated_tree_root_element) is Element 
+0

Что странно с этим, так это для меня с Python 3 Мне пришлось делать 'duplicated_tree_root_element = new_tree.getroot(). Getroot()', потому что тип возвращаемого new_tree.getroot() был по-прежнему «ElementTree». У вас было это? – Jesse

+0

Нет, я этого не сделал. Я разработал этот код с помощью Python 2. Я также узнал, что этот метод не дает вам РЕАЛЬНОЙ КОПИИ дерева, он просто дает мне ссылку для этого узла. Но он получил работу за то, что мне нужно ... – DarkLighting