2

次のようなノードを含む XML ファイルがあります。

<trkpt lat="-37.7944415" lon="144.9616159">
  <ele>41.3681107</ele>
  <time>2015-04-11T03:52:33.000Z</time>
  <speed>3.9598</speed>
</trkpt>

lxml.etree.iterparse() を使用してツリーを繰り返し解析しています。各 trkpt 要素の子をループして、子ノードのテキスト値を出力したいと考えています。例えば

for event, element in etree.iterparse(infile, events=("start", "end")):
    if element.tag == NAMESPACE + 'trkpt':
        for child in list(element):
            print child.text

問題は、この段階ではノードにテキストがないため、印刷の出力が「なし」になることです。

「print child.text」ステートメントを「print etree.tostring(child)」に置き換えることでこれを検証しました。出力は次のようになります

<ele/>
<time/>
<speed/>    

ドキュメントによると、「要素のテキスト、テール、および子は、開始イベントを受け取ったときにまだ存在しているとは限らないことに注意してください。要素が完全に解析されたことを保証するのは、終了イベントだけです。」

したがって、for ループをこれに変更しました。'if event == "end":' ステートメントに注意してください。

for event, element in etree.iterparse(infile, events=("start", "end")):
    if element.tag == NAMESPACE + 'trkpt':
        if event == "end":
            for child in list(element):
                print child.text

しかし、私はまだ同じ結果を得ています。どんな助けでも大歓迎です。

4

2 に答える 2

1

element.clear()このように、条件文の後にeg を呼び出さないでよろしいですか?

for event, element in etree.iterparse(infile, events=("start", "end")):
  if element.tag == NAMESPACE + 'trkpt' and event == 'end':
    for child in list(element):
        print child.text
  element.clear()

問題は、パーサーがイベントを送信する前に子要素のイベントを発行することendですtrkpt(ネストされた要素の終了タグを最初に検出するため)。end外側の要素に対してイベントが呼び出される前に、解析された要素に変更を加えると、説明した動作が発生する可能性があります。

次の代替案を検討してください。

for event, element in etree.iterparse(infile, events=('end',),
    tag=NAMESPACE + 'trkpt'):
  for child in element:
     print child.text
  element.clear()
于 2015-11-22T16:11:42.180 に答える