iterparse没有获取子元素文本
编辑:我找到了解决办法。原来我在下面的代码中有一个 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
把返回语句去掉,这段代码就能正常工作了。