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

Parse XML time series data to dat files

我正在尝试将具有时间序列数据的 XML 解析为每个位置的单独 .dat 文件。到目前为止,我可以提取时间序列数据,但我无法将位置 ID 提取出来,并作为相关时间序列数据的 header。尝试了在 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

我知道我最终需要创建一个循环,所以先获取 header,然后获取数据,依此类推。最后,我会将所需的结果拆分为每个 locationId 的单独 .dat 文件。

您应该将两个不同的 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 - ./header/locationId 获取其对应的 locationId ,并使用 xpath - ./event .[=19 获取其对应的 event 元素=]