python XML元素删除错误

时间:2016-03-09 10:01:44

标签: 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 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:通过修改元素值来修改树

2 个答案:

答案 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