【问题标题】:Parsing NWS XML Data - cap:geocode解析 NWS XML 数据 - cap:geocode
【发布时间】:2014-06-12 20:11:14
【问题描述】:

我在这里关注了信息:

Parse XML namespaces with php SimpleXML

这适用于除“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 对。

【问题讨论】:

  • 您错过了显示 XML。仅在某些子元素上使用命名空间前缀并不意味着您在右侧使用它$entry。很可能你只是犯了一个小错误,仅此而已。
  • @hakre 我添加了链接文章中的 XML。
  • 是整个 XML 还是摘录?如果是摘录,请添加(至少示例性/缩短)由$entry 表示的 XML,包括它的父元素。
  • 整个 XML 在我在问题顶部链接到的原始文章中。我剪切并粘贴了那篇文章的摘录。 stackoverflow.com/questions/16412047/…

标签: php simplexml xml-namespaces cap


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

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

    之前已经询问/回答过类似 XML 的相同问题:

    【讨论】:

    • 那么,这是我需要向国家气象局报告的事情吗?他们正在生成无效的 XML?显然他们认为它是有效的,否则他们不会那样生成它。
    • 布拉布拉布拉。清楚地。唔。很清楚很清楚。呜呜呜。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2020-06-03
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多