【问题标题】:Mixing Data From Multiple XML Nodes into one PHP Variable将来自多个 XML 节点的数据混合到一个 PHP 变量中
【发布时间】:2011-08-25 09:46:06
【问题描述】:

我正在尝试找出如何使用 SimpleXML 将此 XML 文件的 FIPS 部分合并到一个 php 变量中。

我尝试使用的示例 xml 文件位于 http://codepad.org/MQeR2VBZ

基本上我想要一个带有“001033,001077”的变量(不带引号)

我是 PHP 新手,这是我第一次使用 stackoverflow,所以如果我失败了,请原谅我

【问题讨论】:

    标签: php xml simplexml noaa


    【解决方案1】:

    您可以使用XPath 轻松解决此问题。

    XPath 允许您以几乎任何可能的组合查询文档中的节点。要查询前面带有内容为 FIPS6 的 valueName 元素的地理编码值,您可以使用以下查询:

    /alert/info/area/geocode/value[preceding-sibling::valueName = "FIPS6"]
    

    但是,文档有一个默认的namespace 用于警报元素(如 xmlns 属性所示)。默认情况下,SimpleXml 将无法通过 XPath 访问文档中的任何命名空间节点,直到我们通过 registerXPathNamespace 告诉它命名空间并在查询中的任何元素前加上任意前缀。

    XPath 的结果将是一个包含 SimpleXmlElements 的数组。当您将 SimpleXmlElement 转换为字符串(或在字符串上下文中使用它)时,它将返回它的 nodeValue,这是您实际想要组合的值,因此您只需在结果数组上调用 implode 将值组合成一个字符串。

    代码 (demo)

    $alert = simplexml_load_file('http://…');
    $alert->registerXPathNamespace('a', 'urn:oasis:names:tc:emergency:cap:1.1');
    $fipsValues = implode(',', $alert->xpath(
        '/a:alert/a:info/a:area/a:geocode/a:value[
            preceding-sibling::a:valueName = "FIPS6"
        ]'
    ));
    print_r($fipsValues); // will contain "001033,001077"
    

    【讨论】:

      【解决方案2】:

      这应该会让你走上正确的道路:

      $string = <<<XML
        <?xml version='1.0' encoding='utf-8' standalone='yes'?>
        <?xml-stylesheet href='http://alerts.weather.gov/cap/capatomproduct.xsl' type='text/xsl'?>
          <alert xmlns='urn:oasis:names:tc:emergency:cap:1.1'>
            ....
            [rest of xml here]
            ....
          </alert>
        XML;
      
        $xml = simplexml_load_string( $string );
      
        $fips6 = array();
        foreach( $xml->info->area->geocode AS $element ) {
            if( $element->valueName == 'FIPS6' ) {
                $fips6[] = $element->value;
            }
        }
      
        $value = implode( "," $fips6 );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-27
        • 2021-12-01
        • 1970-01-01
        • 2016-11-26
        • 1970-01-01
        • 2018-09-26
        • 2013-11-22
        • 1970-01-01
        相关资源
        最近更新 更多