私はlxml iterparseを使用して巨大なxmlファイルを読み込みます。与えられたmainElementに対して、私は子要素をチェックし、各子を処理します。しかし、要素内の子を調べると、実際にパーサはいくつかの子ノードを実際には見逃していることに気付きます。私は各要素の長さを印刷しました。要素の長さは、要素タグの定数でなければなりませんが、時にはそれより小さくなります。そして、驚くべきことに、これは通常5番目のブロック(1ブロック=> mainElement発生)で発生します。パーサーが子ノードを見逃すべき理由はありますか?すべての手がかりは?lxml iterparse mising子ノード
from lxml import etree
def parseXml(context,attribList,elemList,mainElement):
for event, element in context:
if element.tag == mainElement and event=='start':
for child in element:
if child.tag in elemList:
print len(child) #for a given child,the len should be constant
#do things
elif event=='end':
element.clear()
おかげコード -
サンプル!
おかげ@unutbuを。私はevents =( 'start'、 'end')を使用していて、 'start'イベント(上記の私のコードを編集)の要素を処理しています。そして、あなたが言ったことはまさに起こっていることだと思います。開始イベントで処理するとき、子ノードはまだ読み取られません。代わりにエンドイベントで処理するようにコードをすばやく更新しましたが、うまくいくようです。私はまだテストしています。もう一度ありがとう、本当にありがとう! – Rinks
これは、要素内のすべての子を取得していないようです。要素内の最後の子のみを返します。推理? –