lxml:在原地修改树

时间:2012-08-17 10:45:27

标签: python lxml

我有这个简单的功能,如果缺少它们会添加新元素:

def add_missing(root):
    """ Add missing elements and return `root` """
    for tag, missing_el in missing_tags.items():
        for elem in root.iterfind(".//" + tag):
            if elem.find(missing_el.tag) is None:
                elem.append(missing_el)
                print tostring(elem)
    print tostring(root)
    return root

然而,当我检查root是否包含缺少的元素时,我只找到包含新附加元素的最后一个元素。

有人指出在迭代时修改etree的方法吗?

1 个答案:

答案 0 :(得分:4)

在树的不同位置添加相同的元素只会移动该元素。使用deepcopy解决了这个问题:

from copy import deepcopy
def add_missing(root):
    """ Add missing elements and return `root` """
    for tag, missing_el in missing_tags.items():
        for elem in root.findall(".//" + tag):
            if elem.find(missing_el.tag) is None:
                elem.append(deepcopy(missing_el))
                print tostring(elem)
    print tostring(root)
    return root