3

getiterator()関数によってルートからすべてのノードを反復しながら、現在のノードを削除する方法は?

import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()

for node in root.getiterator():
     #if some condition:
        #remove(node)
4

1 に答える 1

6

親を知らずにノードを削除することはできませんが、xml.etreeパッケージは特定のノードから親にアクセスする方法を提供しません。

これを回避する唯一の方法は、代わりに親ノードを一致させることです。

for node in root.iter():
    if some_condition_matches_parent:
        for child in list(node.iter()):
            if some_condition_matches_child:
                node.remove(child)

lxmlライブラリ (同じ API を実装していますが、拡張機能が追加されています)に切り替えると、任意のノードから親ノードを取得できます。

node.getparent().remove(node)

の純粋な Python 実装はElement.getiterator()リスト オブジェクトを返しますが、ElementTree モジュールの C 実装 (Python 2 では個別のインポート、可能であれば Python 3 では透過的にインポート) では、getiterator()メソッドはコピーを必要とするライブ ジェネレーターを返します。作る。

その上、このElement.getiterator()メソッドは Python 3.2 で廃止され、Python 3.9 で完全に削除されます。node.iter()その使用を外側のループと内側のループに置き換えましlist(node.iter())た。

于 2013-10-17T06:41:02.880 に答える