2

編集:それを機能させる方法を見つけました。elem.clear()以下のコードに表示されていない呼び出しがあったことがわかりました。申し訳ありません。様子が分かるように修正しました。その呼び出しをifステートメント内に移動すると、問題が解決したことがわかりました。しかし、if ステートメントが終了する前に clear がどのように呼び出されたかはまだわかりません。

次のような XML ファイルがあります。

<alarm> <alarm_id>   127688705 </alarm_id> <site> 1     </site> <event_time> 14/08/31 00:01:00    </event_time> <cease_time> 14/08/31 00:07:00    </cease_time> <problem_text>
    Something went wrong                                     </problem_text> </alarm>

適切なスタイリングがないことはわかっていますが、それが私のスクリプトがそれを受け取る方法なので、全体像を示すことにしました。ファイルには基本的に、<alarm>要素の下に数百の要素があり<root>ます。

私がやりたいのは、ファイルを iterparse で解析し、 の子要素からすべてのテキスト情報を取得することです<alarm>。これまでの私のスクリプトは次のようになります。

import xml.etree.cElementTree as etree

try:
    sourcefile = open('file.xml')
except IOError:
    print('Cannot open ', sourcefile)
    return -1

for event, elem in etree.iterparse(sourcefile):
    if elem.tag == 'alarm':
        print("event:", event)
        for child in elem:
            print(child.tag, child.text)
    elem.clear()

しかし、私Noneは結果として得child.textます。スクリプトを実行したときに得られる出力は次のとおりです。

[big@bang src]$ ./parse_xml.py
event: end
alarm_id None
site None
event_time None
cease_time None
problem_text None

これで手を貸してくれませんか?

4

2 に答える 2

0

これと同じ問題がありました。ルート要素にはテキストと属性がありましたが、子要素にはテキストも要素もありませんでした。私の元のコードは次のとおりです。

    for _, element in ET.iterparse(file_in):
        el = shape_element(element)
        if el:
            data.append(el)
        element.clear()

機能し、子要素のテキストをクリアしないコードは

    for _, element in ET.iterparse(file_in):
        el = shape_element(element)
        if el:
            data.append(el)
            element.clear()
于 2015-06-27T04:08:28.097 に答える
0

return ステートメントを削除すると、このコードは正常に機能します。

于 2014-09-02T18:35:52.040 に答える