如何删除具有相同标记的最后一个兄弟节点?

时间:2013-08-09 16:57:02

标签: python xml xpath elementtree

我无法使用xml.etree.ElementTree删除某些元素。我发现了类似的情况here但它并没有解决我的问题。我还阅读了ElementTreeXPath上的文档。

我有一个类似于

的xml树
<metadata>
    <lineage>
        <srcinfo></srcinfo>
        <procstep>
            <otherinfo></otherinfo>
        </procstep>
        <procstep>
            <otherinfo></otherinfo>
        </procstep>
        <procstep>
            <otherinfo></otherinfo>
        </procstep>
        <procstep>
            <otherinfo></otherinfo>
        </procstep>
    </lineage>
</metadata>

假设我想删除第二个,第三个和第四个procstep元素。我尝试了以下代码,结果为“ValueError:list.remove(x):x not in list”错误。

while len(root.findall('.//lineage/procstep')) > 1:
        root.remove(root.findall('.//lineage/procstep[last()]'))

有关为什么不起作用的任何建议?我的问题有其他方法吗?提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

删除最后一个procstep

要删除procstep元素,请使用procstep的父级(lineage)。

尝试:

lineage = root.find('.//lineage')
last_procstep = lineage.find('./procstep[last()]')
lineage.remove(last_procstep)

如果您使用lxml,则可以使用getparent(),如下所示:

last_procstep = root.find('.//lineage/procstep[last()]')
last_procstep.getparent().remove(last_procstep)

删除procstep元素但第一个

lineage = root.find('.//lineage')
for procstep in tuple(lineage.iterfind('./procstep'))[1:]:
    lineage.remove(procstep)