Скопируйте более 1 указанного узла xml из одного документа в другой, используя python
У меня есть вопрос относительно кода ответа, который я нашел в другом вопросе. Я приложил ссылку для пояснения, но я пойду дальше и скопирую код ответа в этот вопрос.
import xml.etree.ElementTree as ET
def find_child(node, with_name):
"""Recursively find node with given name"""
for element in list(node):
if element.tag == with_name:
return element
elif list(element):
sub_result = find_child(element, with_name)
if sub_result is not None:
return sub_result
return None
def replace_node(from_tree, to_tree, node_name):
"""
Replace node with given node_name in to_tree with
the same-named node from the from_tree
"""
# Find nodes of given name ('car' in the example) in each tree
from_node = find_child(from_tree.getroot(), node_name)
to_node = find_child(to_tree.getroot(), node_name)
# Find where to substitute the from_node into the to_tree
to_parent, to_index = get_node_parent_info(to_tree, to_node)
# Replace to_node with from_node
to_parent.remove(to_node)
to_parent.insert(to_index, from_node)
def get_node_parent_info(tree, node):
"""
Return tuple of (parent, index) where:
parent = node's parent within tree
index = index of node under parent
"""
parent_map = {c:p for p in tree.iter() for c in p}
parent = parent_map[node]
return parent, list(parent).index(node)
from_tree = ET.ElementTree(file='sample1.xml')
to_tree = ET.ElementTree(file='sample2.xml')
replace_node(from_tree, to_tree, 'car')
# ET.dump(to_tree)
to_tree.write('output.xml')
Я использую этот код, предоставленный Дейном, за исключением того, что мне интересно, как сделать еще один шаг вперед. В этой части кода replace_node(from_tree, to_tree, 'car') предоставляется только один узел 'car'. Есть ли способ, которым я мог бы указать несколько узлов, а также несколько дочерних узлов.
Итак, в дополнение к автомобилю, скажем, я хотел бы включить "самолет", "велосипеды: красный", "велосипеды: синий", "велосипеды: зеленый", "поезд" и т. Д.
Я попытался включить их как "машина, самолет, велосипеды: красный, велосипеды: синий, велосипеды: greeen, train"), но это не работает так же хорошо, как создание отдельных строк узла replace_node(from_tree, to_tree, 'car')) код с каждым конкретным узлом и узлом: дочерним, но, похоже, это тоже не работает. Какие-либо предложения?