【问题标题】:iterparse not getting children textiterparse 没有得到子文本
【发布时间】:2014-10-27 02:18:21
【问题描述】:

编辑:我找到了让它工作的方法。原来我有一个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>

我知道它没有正确的样式,但这就是我的脚本接收它的方式,所以我想给你们提供完整的图片。该文件基本上在&lt;root&gt; 元素下有数百个&lt;alarm&gt; 元素。

我要做的是用iterparse解析文件并从&lt;alarm&gt;的子元素中获取所有文本信息。到目前为止,我的脚本如下所示:

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()

但是我从child.text 得到None。这是我运行脚本时得到的输出:

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

你们能帮我解决这个问题吗?

【问题讨论】:

  • 你的代码很适合我。 Python 2.7.3.

标签: python xml python-3.4 iterparse


【解决方案1】:

我遇到了同样的问题 - 我的根元素有文本和属性,但子元素没有文本或元素。我原来的代码是:

    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()

【讨论】:

    【解决方案2】:

    去掉return语句,这段代码就可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 2015-04-17
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多