【问题标题】:Help navigating an XML file with multiple namespaces using simplexml使用 simplexml 帮助导航具有多个命名空间的 XML 文件
【发布时间】:2011-05-08 05:09:31
【问题描述】:

我正在开发一个从 XML 文件中收集气象数据的程序。特别是,我想浏览一个文件,例如下面引用的文件,并提取特定位置的风统计数据。

位置在名称=“station_name”的元素中的 Observation 标记的元数据中标识。风数据包含在 Observation -> 元素中。

使用多个命名空间似乎妨碍了我对如何使用 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);

    ?>

【问题讨论】:

    标签: php xml simplexml xml-namespaces


    【解决方案1】:

    尝试使用XPath 语言通过SimpleXMLElement 中的xpath 方法查询您的数据。

    【讨论】:

    • 好的,我尝试过使用 xpath,但它似乎没有让我到任何地方。我有以下代码:$xml = simplexml_load_file("weather.xml"); $xml-&gt;registerXPathNamespace("om", "http://www.opengis.net/om/1.0"); $elements = $xml-&gt;xpath("//om:Observation"); $location = $xml-&gt;xpath("/om:ObservationCollection/om:member/om:Observation/om:metadata"); $test[0] = $location-&gt;xpath("/set"); foreach($test as $k=&gt;$v){ echo "&lt;br/&gt;$k=$v"; } 这至少给了我一个 $elements 数组,但我没有从 $test 中得到任何东西。
    • "/set" 表示从文档根目录“设置”,尝试使用“./set”甚至只是“设置”作为您的 xpath。还有为什么你将结果分配给 $test[0],为什么不只是 $test?
    • $test[0] 没有充分的理由,我相信这是我假设 $test 返回数组时的残余。当我执行 $location->xpath("./set") 时,我收到此错误:致命错误:在第 9 行的 simple_xml.php 中的非对象上调用成员函数 xpath()。如果我执行 $xml- >xpath("./set") 没有任何内容输出到页面。您将使用什么代码从 xml 文件中返回 的 value 属性?
    【解决方案2】:

    最终我使用 str_replace 替换了原始 xml 字符串中的 om:。这消除了应用名称空间的需要,并使得使用 simplexml 导航 xml 变得简单。

    【讨论】:

    • 讽刺!当我从 Web 服务获取数据时,例如我前一周编写的 last.fm 脚本,我总是使用正则表达式来添加一个临时命名空间到根节点(如果它没有),所以当我合并文档并使用 XSLT 时,我可以轻松区分元素。
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多