从Root中删除元素时,Python ElementTree会给出Error

时间:2013-04-12 21:13:30

标签: python elementtree

尝试从xml文档中删除元素时出现以下错误。 “ValueError:list.remove(x):x不在列表中” 这是代码,错误发生在删除行。

import xml.etree.ElementTree as ET
tree = ET.parse("AddInClasses.xml")
rootElem = tree.getroot()
for class2 in rootElem.findall("Transforms/class"):
    name2 = class2.find("name")
    if name2.text == "Get Field":
        rootElem.remove(class2)
tree.write("AddInClassesTrimmed.xml")

2 个答案:

答案 0 :(得分:9)

您正在循环遍历根 direct 子元素的元素。您需要获得对直接父的引用,而不是

使用ElementTree并不容易,元素上没有父指针。您需要首先遍历Transforms,然后再遍历class

for parent in rootElem.findall("Transforms[class]"):
    for class2 in parent.findall("class"):
        name2 = class2.find("name")
        if name2.text == "Get Field":
            parent.remove(class2)

我添加了一个额外的循环,找到包含至少一个Transforms元素的所有class个元素。

如果您使用的是lxml,那么您可以使用class2.getparent().remove(class2)

答案 1 :(得分:0)

以下也应该有效......

    import xml.etree.ElementTree as ET
    tree = ET.parse("AddInClasses.xml")
    rootElem = tree.getroot()
    for class2 in rootElem.findall("Transforms/class"):
        name2 = class2.find("name")
        if name2.text == "Get Field":
           rootElem.find("Transforms").remove(class2) #<<< see the lone change here
    tree.write("AddInClassesTrimmed.xml")