我有一个包含节点的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问题是,在这个阶段,节点没有文本,所以打印的输出是'None‘。
我已经通过将'print child.text‘语句替换为'print etree.tostring(etree.tostring)’来验证这一点,输出如下所示
<ele/>
<time/>
<speed/> 根据文档,“请注意,在接收start事件时,元素的文本、尾部和子元素还不一定存在。只有end事件保证该元素已被完全解析。”
所以我把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但我还是得到了同样的结果。任何帮助都将不胜感激。
发布于 2015-11-23 00:11:42
你确定你不会像这样在你的条件语句后调用element.clear()吗?
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()问题是解析器在发送trkpt的end事件之前会发出子元素的事件(因为它首先遇到嵌套元素的结束标记)。如果在为外部元素调用end事件之前对已解析的元素进行任何修改,则可能会发生您所描述的行为。
考虑以下替代方案:
for event, element in etree.iterparse(infile, events=('end',),
tag=NAMESPACE + 'trkpt'):
for child in element:
print child.text
element.clear()发布于 2015-05-14 01:04:01
您是否尝试显式地使用iterparse,或者您可以使用其他方法。
e.g.
from lxml import etree
tree = etree.parse('/path/to/file')
root = tree.getroot()
for elements in root.findall('trkpt'):
for child in elements:
print child.textlxml非常擅长解析,并且不会占用太多的memory...not,因此可以确定这是否解决了您的问题,或者您是否正在尝试使用上面的特定方法。
https://stackoverflow.com/questions/29689256
复制相似问题