我试图将带有时间序列数据的XML解析为每个位置的单个.dat文件。到目前为止,我可以提取时间序列数据,但我无法获取位置ID,并作为相关时间序列数据的标题。试过在SO上找到的几种方法,但还没有。非常感谢任何可能的帮助或指针。
示例输入XML:
<TimeSeries>
<timeZone>0.0</timeZone>
<series>
<header>
<type>mean</type>
<locationId>abc</locationId>
<parameterId>xxx</parameterId>
<units>x</units>
</header>
<event date="2015-06-24" time="06:45:00" value="0.0"/>
<event date="2015-06-24" time="06:50:00" value="0.0"/>
</series>
<series>
<header>
<type>mean</type>
<locationId>def</locationId>
<parameterId>yyy</parameterId>
<units>x</units>
</header>
<event date="2015-06-24" time="06:45:00" value="0.0"/>
<event date="2015-06-24" time="06:50:00" value="0.0"/>
</series>
</TimeSeries>
到目前为止代码(位置的中间部分不起作用,但下半部分很好地拉出了时间序列数据)
from xml.etree import ElementTree
with open('foo.xml', 'rt') as document:
tree = ElementTree.parse(document)
for location in tree.findall('series/header'):
locationId = location.find('./locationId')
print locationId.text
for node in tree.iter():
date = node.attrib.get('date')
time = node.attrib.get('time')
value = node.attrib.get('value')
if date and time:
print ' %s , %s , %s' % (date, time, value)
期望的结果:
abc
2015-06-24 , 06:45:00 , 0.0
2015-06-24 , 06:50:00 , 0.0
def
2015-06-24 , 06:45:00 , 0.0
2015-06-24 , 06:50:00 , 0.0
我知道我最终需要创建一个循环,所以先获取标题,然后获取数据,依此类推。最后,我将把所需的结果拆分为每个locationId的单独的.dat文件。
答案 0 :(得分:0)
您应该将两个不同的for
循环合并为一个循环,然后使用xpaths
查找所需的元素。示例 -
with open('foo.xml', 'rt') as document:
tree = ElementTree.parse(document)
for series in tree.findall('.//series'):
locationId = series.find('./header/locationId').text
print locationId
events = series.findall('./event')
for event in events:
print '{}, {}, {}'.format(event.attrib.get('date'), event.attrib.get('time'), event.attrib.get('value'))
首先获取所有series
个元素。然后,对于每个series
元素,它使用xpath - locationId
及其对应的./header/locationId
元素使用xpath - event
得到相应的./event
。