チュートリアルの「イベント駆動型解析」セクションで説明されているパターンを使用しようとしています。lxml
私のコードでは、iterchildren()
メソッドを使用して要素に対して再帰的に実行できる関数を呼び出しています。ここでは、例として 2 つのネストされたループを使用します。
これは期待どおりに機能します。
xml = StringIO("<root><a><b>data</b><c><d/></c></a><a><z/></a></root>")
for ev, elem in etree.iterparse(xml):
if elem.tag == 'a':
for c in elem.iterchildren():
for gc in c.iterchildren():
print gc
出力は<Element d at 0x2df49b0>
です。
しかし.clear()
、最後に追加すると:
for ev, elem in etree.iterparse(xml):
if elem.tag == 'a':
for c in elem.iterchildren():
for gc in c.iterchildren():
print gc
elem.clear()
-- 何も印刷されません。なぜそうなるのですか? また、これを回避するにはどうすればよいですか?
ノート:
- スキップ
iterchildren
して、for c in elem
またはを実行for c in list(elem)
しても、同じ効果があります。 - メモリ使用量を低く抑えるには、反復アプローチを使用する必要があります。
実際の使用例では、属性を使用して要素の検索を行っています。
if elem.attrib.get('id') == elem_id: return _get_info(elem)
内部要素が処理される前に消去する方法clear
と、先祖の処理に必要な間、それらをメモリに保持する方法について説明してください。