pythonlxml:如何判断元素是否已从树中移除?

2024-04-26 07:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用^{cd1>}的^{cd2>}模块操作DOM树。我还没有弄清楚的一个任务是如何测试特定节点是否仍然是解析树的一部分。由于^{cd2>}的行为在^{cd4>}期间删除节点时,大多数情况下都没有定义,因此我将分两个阶段进行操作。

首先,我遍历解析后的树,并通过将它们放在各自的列表中来标记一些节点以进行删除,并标记其他一些节点以进行进一步处理。第二阶段包括遍历要从树中移除和删除节点列表的节点。此时,我有一个节点列表,需要进一步处理,并且有一个树,自从第一次解析它以来,它已经被大量修剪。

我缺少的是一种方法来测试我要处理的节点列表中的某个特定节点是否仍然存在于解析树中。如果它不是树的一部分,那意味着它是我先前删除的一个节点的子代,我想放弃它。问题是,没有一种明显的方法可以便宜地进行这个测试。即使在从该节点上的^{cd5>}调用^{{cd6>}中删除节点后,仍返回原始树。

我可以在每个节点上调用^{{cd7>}来处理和检查我希望在树内节点中使用的根元素,但这是O(n),对于深度DOM树来说,这不会很好地扩展。

有人知道给定^{cd8>}和^{cd5>}的恒定时间操作,以测试前者是否属于后者?

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


Tags: 模块方法标记列表节点定义情况阶段
1条回答
网友
1楼 · 发布于 2024-04-26 07:22:48

第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)

相关问题 更多 >