2011-08-06 8 views
1

(Python 3.2)etreeでiterdescendants()を使用している場合、ツリーを変更しても問題ありませんか?

XMLを解析するのに私はetreeを使用しています。これを行うには、再帰的にiterdescendants()という文書を繰り返しています。だから、何かのように:たまに

for elem in doc.iterdescendants(): 
    if elem.tag == "tag": 
     pass # Further processing 

、私は後で再帰で処理されないようにしたい、子供を含む親タグを処理します。子供たちを破壊するのは大丈夫ですか?私の最初のテストで

は、私が試してみた:何らかの理由で

for child in elem.getchildren(): child.clear() 

、これはすぐに処理されているからelem後の要素になります。それは要素が削除されるようなものです。

私は、(それが親とその子を削除することではなく、同様に影響を受ける/スキップさから、親のそれ以降の兄弟にはなりません)働くこれを試してみました:

elem.clear() 

誰かがこれについていくつかの光を当てることができますか?ありがとう、

+0

あなたがそうした場合の動作は未定義です。 –

答えて

1

私はあなたの代わりに次のコードを持っており、すべての子要素を削除しているようです。私はタグを使ってすべての子孫を見つけて削除するためにiterfindを使います。

for element in doc.iterfind('.//%s'%tag): 
    element.getparent().remove(element) 
+0

うまく動作します、ありがとう! –

+0

ようこそ。私は助けてうれしい –

+0

私はまた、私はなぜこれが働く(そして私の他のアプローチはしなかった)かを理解したと信じています。 'iterparse'と' iterwalk'の説明では、lxmlのドキュメントでは、 'end'イベントの後に反復処理しているツリーを変更できることが記述されています。イベントはiterparseとiterwalkにのみ適用されますが、ここでも同様です。現在要素を反復処理している場合は、要素に触れないでください。しかし、子供たちを自由に修正することができます –

関連する問題