将来自多个XML节点的数据混合到一个PHP变量中

时间:2011-05-14 06:38:09

标签: php xml simplexml noaa

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

但是,该文档对于alert元素具有默认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"

答案 1 :(得分:0)

这应该让你开始走正确的道路:

$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 );