Python lxml:如何判断元素是否已从树中删除?

Python lxml:如何判断元素是否已从树中删除?,python,lxml,Python,Lxml,我正在尝试使用lxml的etree模块操作DOM树。我还没有弄明白的一个任务是如何测试特定节点是否仍然是已解析树的一部分。由于如果在\u ElementTree.iter()期间删除节点,etree的行为大部分是未定义的,因此我分两个阶段进行操作 首先,我遍历解析后的树,通过将一些节点放置在各自的列表中,标记出要删除的节点和要进一步处理的其他节点。第二阶段包括遍历节点列表以删除节点,并将其从树中删除。在这一点上,我有一个要进一步处理的节点列表,还有一个自第一次解析以来就被大量修剪过的树 我缺少的

我正在尝试使用
lxml
etree
模块操作DOM树。我还没有弄明白的一个任务是如何测试特定节点是否仍然是已解析树的一部分。由于如果在
\u ElementTree.iter()
期间删除节点,
etree
的行为大部分是未定义的,因此我分两个阶段进行操作

首先,我遍历解析后的树,通过将一些节点放置在各自的列表中,标记出要删除的节点和要进一步处理的其他节点。第二阶段包括遍历节点列表以删除节点,并将其从树中删除。在这一点上,我有一个要进一步处理的节点列表,还有一个自第一次解析以来就被大量修剪过的树

我缺少的是一种方法来测试我的要处理的节点列表中的特定节点是否仍然存在于解析树中。如果它不是树的一部分,这意味着它是我先前删除的一个节点的后代,我想丢弃它。问题是,没有一种明显的方法可以廉价地进行此测试。即使从
\u ElementTree
中删除了节点,在该节点上调用
getroottree()
也会返回原始树

我可以在每个节点上调用
iterancestors()
,以处理和检查树内节点的根元素,但这是O(n),对于深DOM树来说无法很好地扩展

有没有人知道一个恒定时间操作,给定一个
元素和一个
\u ElementTree
,来测试前者是否是后者的一部分


我意识到向上遍历节点的父链可能是执行此测试的唯一方法,任何更快的方法都需要库执行一些簿记。

步骤0:将xml解析为树。
步骤1:在树上迭代,删除需要删除的节点。
步骤2:迭代剩余的节点,处理那些需要它的节点

如果您拥有步骤0,则可以将iterparse()与结束事件一起使用,以避免以后构建大型树以删除许多节点,并使步骤1更简单:

for event, elem in etree.iterparse(input_xml):
    if elem needs deleting:
        elem.clear() # remove text, tail, attributes, and descendant elements
        delete_todo.append(elem)
您如何处理“删除待办事项”列表?看来移除实际节点还有一步吗?@Ramy:没有“似乎”;绝对正确。阅读文档的iterparse部分——在构建解析树时,不能删除解析器仍在使用的节点,如当前节点。如何:删除中的元素的
方法:elem.getparent().remove(elem)
。。。根据“需要删除”代码的智能程度,可能需要捕获“已删除”异常。