iterparse没有获取子元素文本

2 投票
2 回答
1600 浏览
提问于 2025-04-19 10:42

编辑:我找到了解决办法。原来我在下面的代码中有一个 elem.clear() 的调用,我之前没有提到这点,抱歉。我修改了一下代码,让你们能看到原来的样子。结果发现,如果我把这个调用放到 if 语句里面,问题就解决了。不过我还是不明白为什么 clear 会在 if 语句完成之前就被调用了。

我有一个 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>

我知道它的格式不太规范,但我的脚本就是这样接收的,所以我想给你们一个完整的视图。这个文件基本上在一个 <root> 元素下有成百上千个 <alarm> 元素。

我想用 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()

但是我从 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

你们能帮我一下吗?

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

把返回语句去掉,这段代码就能正常工作了。

撰写回答