0

我在这里关注了信息:

使用 php SimpleXML 解析 XML 命名空间

这适用于除“cap:geocode”和“cap:parameter”条目中包含的信息之外的所有内容。

$geocode = $entry->children('cap',true)->geocode;

返回一个空值。

关于如何获取 cap:geocode 和 cap:parameter 条目中的数据的任何想法?

<cap:geocode>
    <valueName>FIPS6</valueName>
    <value>048017 048079</value>
    <valueName>UGC</valueName>
    <value>TXZ027 TXZ033</value>
</cap:geocode>

我需要阅读 ValueName/Value 对。

4

2 回答 2

1

我在这里使用了这个例子:https ://github.com/tylerlane/php.news-leader.com/blob/master/weather/alerts.php

并出于我的目的对其进行了简化以获取此信息(echo.php 只是将数据打印出来):

$dataFileName = "wx/CAP.xml";
//load the feed
$capXML = simplexml_load_file($dataFileName);
//how many items
$itemsTotal = count($capXML->entry);
if(count($itemsTotal)):
$capXML->registerXPathNamespace('prefix', 'http://www.w3.org/2005/Atom');
$result = $capXML->xpath("//prefix:entry");

foreach($result as $capXML):
        $dc = $capXML->children('urn:oasis:names:tc:emergency:cap:1.1');
        $event = $dc->event;
        $effective = $dc->effective;
        $expires = $dc->expires;
        $status = $dc->status;
        $msgType = $dc->msgType;
        $category = $dc->category;
        $urgency = $dc->urgency;
        $severity = $dc->severity;
        $certainty = $dc->certainty;
        $areadesc = $dc->areaDesc;
        $geopolygon = $dc->polygon;
        //get the children of the geocode element
        $geocodechildren = $dc->geocode->children();
        //only interested in FIPS6 for now
        //no guarantee that FIPS6 will be the first child so we have to deal with that
        if($geocodechildren->valueName == "FIPS6"){
            //isolate all the FIPS codes
            $fips = explode( " ", $geocodechildren->value );

        } else {
            //hide everything else so we don't fail
            $fips = Array();
        }
        //get the VTEC
        $parameter_children = $dc->parameter->children();
        if($parameter_children->valueName == "VTEC"){
            //isolate all VTEC codes
            $vtec = explode( ".", $parameter_children->value );

        } else {
            //hide anything else that may show up
            $vtec = Array();
        }

        include('echo.php');
        print_r($fips);
        echo "<br/>";
        print_r($vtec);
        echo "<hr/>";
endforeach;
endif;
于 2014-05-12T01:51:54.370 回答
0

关于如何获取 cap:geocode 和 cap:parameter 条目中的数据的任何想法?

您的情况的关键是,另一个问题中提供的 XML 无效

您会注意到,如果您在 PHP 开发中遵循了良好的做法:启用最高级别的错误、警告和通知报告,显示这些以及将它们记录到文件中。然后跟踪这些警告。

在您的情况下,您应该看到一些消息,例如:

警告:simplexml...:命名空间错误:事件的命名空间前缀上限未在第 42 行的 /path/to/script.php 中定义

cap这是未定义 XML 命名空间前缀的通知。这意味着 SimpleXML 将删除它。然后将这些元素放入文档的默认命名空间中,以便您可以直接访问它们。

因此,首先让您自己在开发系统上设置您的 php.ini 文件以报告开发错误,这样您就会注意到意外的输入值。一站式是以下问题:

接下来,您需要确定输入错误的原因以及您希望如何处理错误。如果它失败(XML 的设计建议采用失败路线,这也被认为是 XML 的设计问题)或者您想要“修复”XML 还是想要使用无效的 XML。该决定取决于。SimpleXML 确实像宣布的那样工作,只是在您的情况下,您没有注意到错误并且到目前为止您没有进行任何错误处理。

以前曾询问/回答过类似 XML 的相同问题:

于 2014-05-03T08:06:11.020 回答