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)
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)
親を知らずにノードを削除することはできませんが、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())
た。