python XML元素删除错误

python XML元素删除错误,python,xml,Python,Xml,我将文件中的树作为字符串读取,并将其从名称空间中删除 with open(pathArxmlFileName, 'r') as myfile: data=myfile.read(); data = re.sub(' xmlns="[^"]+"', '', data, count=1) self.root = ET.fromstring(data); self.tree = ET.ElementTree(self.root) 我想从此树中删除一个XML元素 我试过: f

我将文件中的树作为字符串读取,并将其从名称空间中删除

with open(pathArxmlFileName, 'r') as myfile:
    data=myfile.read();
data = re.sub(' xmlns="[^"]+"', '', data, count=1)
self.root = ET.fromstring(data);        
self.tree =  ET.ElementTree(self.root)
我想从此树中删除一个XML元素

我试过:

for EL in self.root.iter('tagString'):
    self.root.remove(EL);
此查找元素,但调用remove()函数时出现错误:

   self._children.remove(element)
ValueError: list.remove(x): x not in list
请帮帮我,我不知道该怎么办:(


Ps:通过修改元素值来修改树是有效的

我怀疑抛出了此错误,因为您试图删除带有“tagString”的元素,就像它们是根元素的直接子元素一样。如果“tagString”元素嵌套在树的更深处,尝试使用根元素删除它们将导致您看到的错误

XML示例:

<RootElement>
  <Child>
    <tagString/>
  </Child>
</RootElement>
其中root是“RootElement”,EL是“tagString”

抛出错误是因为不是的直接子级

因此,如果要使用ElementTree,则必须执行以下操作:

for EL in self.root.iter():
    for child in list(EL):
        if child.tag == "tagString":
            EL.remove(child)
这将遍历树中的每个元素。它将检查是否有子元素包含您正在查找的标记字符串,如果找到任何子元素,它将使用相应的父引用而不是根元素删除它们。

我找到了解决方案:

for EL in self.root.iter('tag1'):
    if parameterFound == True:
        break;
    for numValue in EL.findall('tag2'):#finds only direct childrens
        [name, val]=self.__getParameterNameAndValue(numValue);
        if name == paramNameToDel:
            parameterFound = True;
            EL.remove(numValue);
            break;
    for numValue in EL.findall('tag3'):#finds only direct childrens
        [name, val]=self.__getParameterNameAndValue(numValue);
        if name == paramNameToDel:
            parameterFound = True;
            EL.remove(numValue);
            break;
return parameterFound

张贴仍然演示问题的最小XML示例
for EL in self.root.iter('tag1'):
    if parameterFound == True:
        break;
    for numValue in EL.findall('tag2'):#finds only direct childrens
        [name, val]=self.__getParameterNameAndValue(numValue);
        if name == paramNameToDel:
            parameterFound = True;
            EL.remove(numValue);
            break;
    for numValue in EL.findall('tag3'):#finds only direct childrens
        [name, val]=self.__getParameterNameAndValue(numValue);
        if name == paramNameToDel:
            parameterFound = True;
            EL.remove(numValue);
            break;
return parameterFound