我从文件中读取一个树作为字符串并从中删除名称空间。
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 elemet
我试过了:
for EL in self.root.iter('tagString'):
self.root.remove(EL);
这样找到EL元素但是当我调用remove()函数时会出错:
self._children.remove(element)
ValueError: list.remove(x): x not in list
请帮助我,我不知道该怎么做:(
Ps:通过修改元素值来修改树
答案 0 :(得分:3)
我怀疑这个错误正在被抛出,因为你试图用' tagString'删除元素。好像他们是你的根元素的直接孩子。如果' tagString'元素嵌套在树的更远的地方,尝试使用根元素删除它们将导致您看到的错误。
示例XML:
select count(*) from Event e join e.clusters c where :id in (c.id)
所以基本上你最终会打电话:
<RootElement>
<Child>
<tagString/>
</Child>
</RootElement>
其中root是&#34; RootElement&#34;和EL是&#34; tagString&#34;。
抛出错误是因为&lt; tagString&gt;不是&lt; RootElement&gt;的直接孩子!
因此,如果您要使用ElementTree,则必须执行以下操作:
root.remove(EL)
这将迭代树中的每个元素。它将检查是否有任何子项包含您要查找的标记字符串,如果找到任何标记字符串,它将使用适当的父引用而不是根元素删除它们。
答案 1 :(得分:1)
我找到了解决方案:
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