I'm trying to solve a problem where I have XML data that has 2 time series (sometimes more) of measurements in the same file. In this case temperature and wind speed measurements from the same time interval. See the XML file below:
<?xml version="1.0" encoding="UTF-8"?> <wfs:FeatureCollection timeStamp="2015-04-16T09:40:29Z" numberMatched="2" numberReturned="2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:om="http://www.opengis.net/om/2.0" xmlns:ompr="http://inspire.ec.europa.eu/schemas/ompr/2.0rc3" xmlns:omso="http://inspire.ec.europa.eu/schemas/omso/2.0rc3" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:swe="http://www.opengis.net/swe/2.0" xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0" xmlns:sam="http://www.opengis.net/sampling/2.0" xmlns:sams="http://www.opengis.net/samplingSpatial/2.0" xmlns:wml2="http://www.opengis.net/waterml/2.0" xmlns:target="http://xml.fmi.fi/namespace/om/atmosphericfeatures/0.95" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gmlcov/1.0 http://schemas.opengis.net/gmlcov/1.0/gmlcovAll.xsd http://www.opengis.net/sampling/2.0 http://schemas.opengis.net/sampling/2.0/samplingFeature.xsd http://www.opengis.net/samplingSpatial/2.0 http://schemas.opengis.net/samplingSpatial/2.0/spatialSamplingFeature.xsd http://www.opengis.net/swe/2.0 http://schemas.opengis.net/sweCommon/2.0/swe.xsd http://inspire.ec.europa.eu/schemas/ompr/2.0rc3 http://inspire.ec.europa.eu/draft-schemas/ompr/2.0rc3/Processes.xsd http://inspire.ec.europa.eu/schemas/omso/2.0rc3 http://inspire.ec.europa.eu/draft-schemas/omso/2.0rc3/SpecialisedObservations.xsd http://www.opengis.net/waterml/2.0 http://inspire.ec.europa.eu/draft-schemas/waterml/2.0rfc/waterml2.xsd http://xml.fmi.fi/namespace/om/atmosphericfeatures/0.95 http://xml.fmi.fi/schema/om/atmosphericfeatures/0.95/atmosphericfeatures.xsd"> <wfs:member> <omso:PointTimeSeriesObservation gml:id="WFS-fip7WVVLMFTJudLNbf8qa6jEiVKJTowqYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08oWliy59O6pp25bX_0KFCMbHy51qRaFOO6dNGTVwzsu7JU07ctr_6FCiGdm26eenJzrMYsGLBg3Zmzfjw7MtambTfjSV3XpmcNbbh8RNPPph3Y8tK1dCA0tuHxF4b8ejnODHM3tuXpl30MPLDty9MvLnWt0y7eGXlh6deWVrbdPPnp3Z6mXx0rGnYZza3dds_NT6Yemnfu5zhNbj1w7NPTzJ3Zt9Y2_Nma3Pph6ad.6p54Za0N_DLuyYemFuc.m_llyceuXl5v6claYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08mh007ctPpl4T8hNDpp25bW_dlrGq1IYA-"> <om:phenomenonTime> <gml:TimePeriod gml:id="time1-1-1"> <gml:beginPosition>2015-01-01T00:00:00Z</gml:beginPosition> <gml:endPosition>2015-01-02T00:00:00Z</gml:endPosition> </gml:TimePeriod> </om:phenomenonTime> <om:resultTime> <gml:TimeInstant gml:id="time2-1-1"> <gml:timePosition>2015-01-02T00:00:00Z</gml:timePosition> </gml:TimeInstant> </om:resultTime> <om:procedure xlink:href="http://xml.fmi.fi/inspire/process/opendata"/> <om:parameter> <om:NamedValue> <om:name xlink:href="http://inspire.ec.europa.eu/codeList/ProcessParameterValue/value/groundObservation/observationIntent"/> <om:value> atmosphere </om:value> </om:NamedValue> </om:parameter> <om:observedProperty xlink:href="http://data.fmi.fi/fmi-apikey/41156987-d187-45e2-a2d3-6113c39b15ab/meta?observableProperty=observation&param=temperature&language=eng"/> <om:featureOfInterest> <sams:SF_SpatialSamplingFeature gml:id="fi-1-1-temperature"> <sam:sampledFeature> <target:LocationCollection gml:id="sampled-target-1-1-temperature"> <target:member> <target:Location gml:id="obsloc-fmisid-101007-pos-temperature"> <gml:identifier codeSpace="http://xml.fmi.fi/namespace/stationcode/fmisid">101007</gml:identifier> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/name">Helsinki Rautatientori</gml:name> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/geoid">-16011680</gml:name> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/wmo">2934</gml:name> <target:representativePoint xlink:href="#point-101007"/> <target:region codeSpace="http://xml.fmi.fi/namespace/location/region">Helsinki</target:region> </target:Location></target:member> </target:LocationCollection> </sam:sampledFeature> <sams:shape> <gml:Point gml:id="point-1-1-temperature" srsName="http://www.opengis.net/def/crs/EPSG/0/4258" srsDimension="2"> <gml:name>Helsinki Rautatientori</gml:name> <gml:pos>60.17169 24.94460 </gml:pos> </gml:Point> </sams:shape> </sams:SF_SpatialSamplingFeature> </om:featureOfInterest> <om:result> <wml2:MeasurementTimeseries gml:id="obs-obs-1-1-temperature"> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T00:00:00Z</wml2:time> <wml2:value>4.6</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T01:00:00Z</wml2:time> <wml2:value>4.5</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T02:00:00Z</wml2:time> <wml2:value>4.2</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T03:00:00Z</wml2:time> <wml2:value>4.0</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T04:00:00Z</wml2:time> <wml2:value>4.1</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T05:00:00Z</wml2:time> <wml2:value>4.1</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T06:00:00Z</wml2:time> <wml2:value>4.5</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T07:00:00Z</wml2:time> <wml2:value>4.1</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T08:00:00Z</wml2:time> <wml2:value>3.3</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T09:00:00Z</wml2:time> <wml2:value>2.9</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T10:00:00Z</wml2:time> <wml2:value>2.5</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T11:00:00Z</wml2:time> <wml2:value>2.4</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T12:00:00Z</wml2:time> <wml2:value>2.5</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T13:00:00Z</wml2:time> <wml2:value>2.7</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T14:00:00Z</wml2:time> <wml2:value>2.8</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T15:00:00Z</wml2:time> <wml2:value>3.1</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T16:00:00Z</wml2:time> <wml2:value>3.3</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T17:00:00Z</wml2:time> <wml2:value>3.7</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T18:00:00Z</wml2:time> <wml2:value>4.1</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T19:00:00Z</wml2:time> <wml2:value>4.1</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T20:00:00Z</wml2:time> <wml2:value>4.4</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T21:00:00Z</wml2:time> <wml2:value>4.7</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T22:00:00Z</wml2:time> <wml2:value>4.6</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T23:00:00Z</wml2:time> <wml2:value>4.7</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-02T00:00:00Z</wml2:time> <wml2:value>4.2</wml2:value> </wml2:MeasurementTVP> </wml2:point> </wml2:MeasurementTimeseries> </om:result> </omso:PointTimeSeriesObservation> </wfs:member> <wfs:member> <omso:PointTimeSeriesObservation gml:id="WFS-6fPzOlwmFuqLQd1YDR_0qMRemw2JTowqYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08oWliy59O6pp25bX_0KFCMbHy51qRaFOO6dNGTVwzsu7JU07ctr_6FCiGdm26eenJzrMYsGLBg3Zmzfjw7MtambTfjSV3XpmcNbbh8RNPPph3Y8tK1dCA0tuHxF4b8ejnODHM3tuXpl30MPLDty9MvLnWt307snPhly5NvNrbdPPnp3Z6mXx0rGnYZza3dds_NT6Yemnfu5zhNbj1w7NPTzJ3Zt9Y2_Nma3Pph6ad.6p54Za0N_DLuyYemFuc.m_llyceuXl5v6claYWbbpdOt.Lnl5dsPTTv3c3Trvlw9NGXk6ddNO3L2w7OuXhh08mh007ctPpl4T8hNDpp25bW_dlrGq1IYA-"> <om:phenomenonTime xlink:href="#time1-1-1"/> <om:resultTime xlink:href="#time2-1-1"/> <om:procedure xlink:href="http://xml.fmi.fi/inspire/process/opendata"/> <om:parameter> <om:NamedValue> <om:name xlink:href="http://inspire.ec.europa.eu/codeList/ProcessParameterValue/value/groundObservation/observationIntent"/> <om:value> atmosphere </om:value> </om:NamedValue> </om:parameter> <om:observedProperty xlink:href="http://data.fmi.fi/fmi-apikey/41156987-d187-45e2-a2d3-6113c39b15ab/meta?observableProperty=observation&param=windspeedms&language=eng"/> <om:featureOfInterest> <sams:SF_SpatialSamplingFeature gml:id="fi-1-1-windspeedms"> <sam:sampledFeature> <target:LocationCollection gml:id="sampled-target-1-1-windspeedms"> <target:member> <target:Location gml:id="obsloc-fmisid-101007-pos-windspeedms"> <gml:identifier codeSpace="http://xml.fmi.fi/namespace/stationcode/fmisid">101007</gml:identifier> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/name">Helsinki Rautatientori</gml:name> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/geoid">-16011680</gml:name> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/wmo">2934</gml:name> <target:representativePoint xlink:href="#point-101007"/> <target:region codeSpace="http://xml.fmi.fi/namespace/location/region">Helsinki</target:region> </target:Location></target:member> </target:LocationCollection> </sam:sampledFeature> <sams:shape> <gml:Point gml:id="point-1-1-windspeedms" srsName="http://www.opengis.net/def/crs/EPSG/0/4258" srsDimension="2"> <gml:name>Helsinki Rautatientori</gml:name> <gml:pos>60.17169 24.94460 </gml:pos> </gml:Point> </sams:shape> </sams:SF_SpatialSamplingFeature> </om:featureOfInterest> <om:result> <wml2:MeasurementTimeseries gml:id="obs-obs-1-1-windspeedms"> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T00:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T01:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T02:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T03:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T04:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T05:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T06:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T07:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T08:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T09:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T10:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T11:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T12:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T13:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T14:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T15:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T16:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T17:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T18:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T19:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T20:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T21:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T22:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-01T23:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2015-01-02T00:00:00Z</wml2:time> <wml2:value>NaN</wml2:value> </wml2:MeasurementTVP> </wml2:point> </wml2:MeasurementTimeseries> </om:result> </omso:PointTimeSeriesObservation> </wfs:member> </wfs:FeatureCollection> The data is nested within <wml2:MeasurementTimeseries gml:id="obs-obs-1-1-temperature"> for the temperature and within <wml2:MeasurementTimeseries gml:id="obs-obs-1-1-windspeedms"> for the wind speed (NaN's in this file).
I would like to iterate through those series separately and save them to .txt file in tabular format. I'm able to save the times series data, but I cant separate them column wise eg. to time|temp|wind speed format.
My current code works if the XML file has only one measurement (temp OR wind speed separately) because I only need to iterate through the file.
import xml.etree.cElementTree as ET tree = ET.ElementTree(file='XML_file.xml') def parser(item1,item2): return item1.text,item2.text data = [parser(item1,item2) for item1,item2 in zip(tree.iter(tag='{http://www.opengis.net/waterml/2.0}time'),tree.iter(tag='{http://www.opengis.net/waterml/2.0}value'))] with open('data.txt', 'w') as fp: fp.write('\n'.join('%s|%s' % x for x in data)) Because the measurements for temp and ws are the same length how could I iterate through them (different tag perhaps?) and return tuple for each time point eg. (time,temp value, winds speed value)
EDIT: This prints results. But if I add tag like this i.iter(tag='{http://www.opengis.net/waterml/2.0}MeasurementTimeseries') I get TypeError: iter() takes no keyword arguments.
for i in tree.iter(tag='{http://www.opengis.net/waterml/2.0}MeasurementTimeseries'): for j in i.iter(): print j.text This prints:
2015-01-01T00:00:00Z 4.6 2015-01-01T01:00:00Z 4.5
zip, which you're already using, so presumably you know how to use it again.timeandvaluefrom each particular series, instead of getting anytimeandvaluetags anywhere in the file?