2015-10-01 3 views
0

Скажем, у меня есть этот XML-файл:питон ElementTree: обновление поддерево

<root> 
    <abc>SomeTree1</abc> 
    <abc>SomeTree2</abc> 
    ... 
</root> 

, и я хочу сделать некоторые операции над элементами в «Азбуке». так что я что-то вроде этого:

for element in root.findall('./abc') 
    ** new_element = function1(element) ** 

(function1 действует на элемент и возвращает обновленную версию этого). Как обновить root с помощью new_element вместо элемента? (Может быть, что-то вроде: element.set (new_element))?

Спасибо

+1

Что именно вы имеете в виду под обновлением? Любые изменения, внесенные вами в ваши элементы, будут автоматически сохранены в корне. – Plasma

+0

@Plasma Я думаю, стоит упомянуть, что эти изменения происходят внутри функций. (я отредактирую вопрос, так что с этого момента будет яснее) – Omer

ответ

0

Вы можете передать root вашего дерева функции, а затем использовать ElementTree.SubElement, чтобы добавить новый элемент к вашему root. Я работал с вашим примером:

import xml.etree.ElementTree as ET 

def function(root): 
    new_element = ET.SubElement(root, "abc") 
    new_element.set("name", "Jonas") 
    new_element.text = "This is text" 

tree = ET.parse("test.xml") 
root = tree.getroot() 

# Before 
print ET.tostring(root) 

for element in root.findall("./abc"): 
    function(root) 

# After 
print ET.tostring(root) 

До:

<root> 
    <abc>SomeTree1</abc> 
</root> 

После:

<root> 
    <abc>SomeTree1</abc> 
    <abc name="Jonas">This is text</abc> 
</root> 

Обратите внимание, что я отполированы XML-сам, это не очень по-умолчанию. Если вы хотите красивую печать, проверьте this ответ.

Редактировать: Извините, из комментариев я подумал, что вы хотите добавить новый элемент, а не заменить текущий. Для замены этого элемента, вы можете либо изменить функцию выше, принять в элементе, а затем добавить новый элемент перед удалением оригинала, или вы могли бы просто изменить существующий элемент непосредственно:

import xml.etree.ElementTree as ET 

def function(element): 
    element.text = "New text" 
    element.tag = "New tag" 
    element.set("name", "Jonas") 

tree = ET.parse("test.xml") 
root = tree.getroot() 

# Before 
print ET.tostring(root) 

for element in root.findall("./abc"): 
    function(element) 

# After 
print ET.tostring(root) 

Перед:

<root> 
    <abc>SomeTree1</abc> 
</root> 

После:

<root> 
    <New tag name="Jonas">New text</New tag> 
</root> 
+0

Это то, что я пробовал, и элементы не обновлялись в корне. Я еще раз увижу, если я сделал что-то неправильно, но я так не думаю. Изменение значения элемента в функции не изменяет его вне этой функции. – Omer

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