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