使用 simplexml 帮助导航具有多个命名空间的 XML 文件
我正在开发一个从 XML 文件收集气象数据的程序。特别是,我想浏览一个文件(例如下面引用的文件)并提取特定位置的风统计数据。
位置在元素中的观察标记的元数据中通过 name="station_name" 进行标识。风数据包含在观测 -> 中。元素。
多个命名空间的使用似乎阻碍了我对如何使用 simplexml 解析 xml 文件的有限了解。
我试图解析的xml文件是: http://dd .weatheroffice.gc.ca/observations/xml/MB/hourly/hourly_mb_2011050723_e.xml
我有将其减少以测试一个观察结果(如下所示):
<?xml version="1.0" encoding="UTF-8"?>
<om:ObservationCollection xmlns:om="http://www.opengis.net/om/1.0" xmlns="http://dms.ec.gc.ca/schema/point-observation/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<om:member>
<om:Observation>
<om:metadata>
<set><general><author name="MSC-DMS-PG-WXO-HOURLY" version="1.5"/><dataset name="msc/observation/atmospheric/surface_weather/wxo-2.0-ascii"/><phase name="product-hourly_en-xml-2.0"/><id xlink:href="/data/msc/observation/atmospheric/surface_weather/wxo-2.0-ascii/product-hourly_en-xml-2.0/201105072356/mb"/><parent xlink:href="/data/msc/observation/atmospheric/surface_weather/cs-1.0-binary/decoded-xml-2.0/201105072300/cpgh"/></general>
<identification-elements>
<element name="station_name" uom="unitless" value="Gimli"/>
<element name="latitude" uom="degree" value="50.63"/>
<element name="longitude" uom="degree" value="-97.05"/>
<element name="transport_canada_id" uom="unitless" value="PGH"/>
<element name="observation_date_utc" uom="unitless" value="2011-05-07T23:00:00.000Z"/>
<element name="observation_date_local_time" uom="unitless" value="2011-05-07T18:00:00.000 CDT"/>
<element name="climate_station_number" uom="unitless" value="5031042"/>
<element name="wmo_station_number" uom="unitless" value="71748"/>
</identification-elements>
</set>
</om:metadata>
<om:samplingTime><gml:TimeInstant><gml:timePosition>2011-05-07T23:00:00.000Z</gml:timePosition></gml:TimeInstant></om:samplingTime>
<om:resultTime><gml:TimeInstant><gml:timePosition>2011-05-07T23:56:09.099Z</gml:timePosition></gml:TimeInstant></om:resultTime>
<om:procedure xlink:href=""/>
<om:observedProperty gml:remoteSchema="/schema/point-observation/2.0.xsd"/>
<om:featureOfInterest>
<gml:FeatureCollection>
<gml:location><gml:Point><gml:pos>50.63333333333333 -97.05</gml:pos></gml:Point></gml:location>
</gml:FeatureCollection>
</om:featureOfInterest>
<om:result>
<orig-header/>
<elements>
<element name="present_weather" uom="code" value=""/>
<element name="mean_sea_level" uom="kPa" value="100.89"/>
<element name="tendency_amount" uom="kPa" value="0.07"/>
<element name="tendency_characteristic" uom="code" value="rising"/>
<element name="horizontal_visibility" uom="km" value=""/>
<element name="air_temperature" uom="Celsius" value="11.4"/>
<element name="dew_point" uom="Celsius" value="8.2"/>
<element name="relative_humidity" uom="percent" value="81.0"/>
<element name="wind_speed" uom="km/h" value="24.8"/>
<element name="wind_direction" uom="code" value="SW"/>
<element name="wind_gust_speed" uom="km/h" value="36.4"/>
<element name="total_cloud_cover" uom="code" value=""/>
<element name="wind_chill" uom="unitless" value=""/>
<element name="humidex" uom="unitless" value=""/>
</elements>
</om:result>
</om:Observation>
</om:member>
</om:ObservationCollection>
这是我到目前为止所拥有的,它正式让我无处可去......
<?php
$xml = simplexml_load_file("weather.xml");
foreach($xml->item as $item){
$collection = $item->children("http://www.opengis.net/om/1.0");
}
print_r($collection->member);
?>
I am working on a program to collect meteorological data from an XML file. In particular I would like to navigate through a file such as the one referenced below and pull out wind statistics for specific locations.
Locations are identified in the metadata of the Observation tag in the element with name="station_name". The wind data is contained in Observation -> elements.
The use of multiple namespaces seems to be stymying my limited knowledge of how to use simplexml to parse an xml file.
An xml file I am trying to parse is: http://dd.weatheroffice.gc.ca/observations/xml/MB/hourly/hourly_mb_2011050723_e.xml
I have cut this down for testing to one observation (per below):
<?xml version="1.0" encoding="UTF-8"?>
<om:ObservationCollection xmlns:om="http://www.opengis.net/om/1.0" xmlns="http://dms.ec.gc.ca/schema/point-observation/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<om:member>
<om:Observation>
<om:metadata>
<set><general><author name="MSC-DMS-PG-WXO-HOURLY" version="1.5"/><dataset name="msc/observation/atmospheric/surface_weather/wxo-2.0-ascii"/><phase name="product-hourly_en-xml-2.0"/><id xlink:href="/data/msc/observation/atmospheric/surface_weather/wxo-2.0-ascii/product-hourly_en-xml-2.0/201105072356/mb"/><parent xlink:href="/data/msc/observation/atmospheric/surface_weather/cs-1.0-binary/decoded-xml-2.0/201105072300/cpgh"/></general>
<identification-elements>
<element name="station_name" uom="unitless" value="Gimli"/>
<element name="latitude" uom="degree" value="50.63"/>
<element name="longitude" uom="degree" value="-97.05"/>
<element name="transport_canada_id" uom="unitless" value="PGH"/>
<element name="observation_date_utc" uom="unitless" value="2011-05-07T23:00:00.000Z"/>
<element name="observation_date_local_time" uom="unitless" value="2011-05-07T18:00:00.000 CDT"/>
<element name="climate_station_number" uom="unitless" value="5031042"/>
<element name="wmo_station_number" uom="unitless" value="71748"/>
</identification-elements>
</set>
</om:metadata>
<om:samplingTime><gml:TimeInstant><gml:timePosition>2011-05-07T23:00:00.000Z</gml:timePosition></gml:TimeInstant></om:samplingTime>
<om:resultTime><gml:TimeInstant><gml:timePosition>2011-05-07T23:56:09.099Z</gml:timePosition></gml:TimeInstant></om:resultTime>
<om:procedure xlink:href=""/>
<om:observedProperty gml:remoteSchema="/schema/point-observation/2.0.xsd"/>
<om:featureOfInterest>
<gml:FeatureCollection>
<gml:location><gml:Point><gml:pos>50.63333333333333 -97.05</gml:pos></gml:Point></gml:location>
</gml:FeatureCollection>
</om:featureOfInterest>
<om:result>
<orig-header/>
<elements>
<element name="present_weather" uom="code" value=""/>
<element name="mean_sea_level" uom="kPa" value="100.89"/>
<element name="tendency_amount" uom="kPa" value="0.07"/>
<element name="tendency_characteristic" uom="code" value="rising"/>
<element name="horizontal_visibility" uom="km" value=""/>
<element name="air_temperature" uom="Celsius" value="11.4"/>
<element name="dew_point" uom="Celsius" value="8.2"/>
<element name="relative_humidity" uom="percent" value="81.0"/>
<element name="wind_speed" uom="km/h" value="24.8"/>
<element name="wind_direction" uom="code" value="SW"/>
<element name="wind_gust_speed" uom="km/h" value="36.4"/>
<element name="total_cloud_cover" uom="code" value=""/>
<element name="wind_chill" uom="unitless" value=""/>
<element name="humidex" uom="unitless" value=""/>
</elements>
</om:result>
</om:Observation>
</om:member>
</om:ObservationCollection>
This is what I have so far, and it is officially getting me nowhere...
<?php
$xml = simplexml_load_file("weather.xml");
foreach($xml->item as $item){
$collection = $item->children("http://www.opengis.net/om/1.0");
}
print_r($collection->member);
?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
尝试使用 XPath 语言通过 xpath 方法。
Try using XPath language to query for your data with xpath method from SimpleXMLElement.
最终我使用 str_replace 来替换原始 xml 字符串中的 om: 。这消除了应用名称空间的需要,并且使得使用 simplexml 导航 xml 变得简单。
Ultimately I've used str_replace to replace the om: in the original xml string. This negated the need to apply the name space, and made it simple to navigate the xml using simplexml.