将XML时间序列数据解析为dat文件

时间:2015-08-06 10:45:24

标签: python xml elementtree

我试图将带有时间序列数据的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文件。

1 个答案:

答案 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