从XML获取数据

时间:2015-10-09 11:38:31

标签: php xml parsing

我正在努力使用PHP阅读XML文件。

我想使用的XML在这里: http://www.gdacs.org/xml/rss.xml

现在,我感兴趣的数据是“项目”节点。

我创建了以下函数,它获取数据:

$rawData = simplexml_load_string($response_xml_data);

foreach($rawData->channel->item as $value) { 
    $title = $value->title;

.... 这很好。

带有“gdcs:xxxx”的节点稍微有点问题,但我使用了以下代码,它也有效:

$subject = $value->children('dc', true)->subject;

现在我遇到的问题是“资源”节点,

基本上,它的精简版本如下所示:

<channel>
   <item>
      <gdacs:resources>
         <gdacs:resource id="xx" version="0" source="xx" url="xx" type="xx">
            <gdacs:title>xxx</gdacs:title>
         </gdacs:resource>
         <gdacs:resource id="xx" version="0" source="xx" url="xx" type="xx">
            <gdacs:title>xxx</gdacs:title>
         </gdacs:resource>
         <gdacs:resource id="xx" version="0" source="xx" url="xx" type="xx">
            <gdacs:title>xxx</gdacs:title>
         </gdacs:resource>
      </gdacs:resources>
   </item>
</channel>

在这种情况下我如何获得资源?我总能得到第一个资源,只有它的标题。我想要做的是获取所有资源项,这些项具有特定值的“类型”并获取其URL。

2 个答案:

答案 0 :(得分:2)

从我的经验来看,在常规路径中运行XML是缓慢而难以忍受的。

了解XPath - &gt;它是一种通过选择器(类似于CSS选择器)从XML中提取数据的方法

http://php.net/manual/en/simplexmlelement.xpath.php

您可以按类似于CSS的属性选择元素

<?php
$xmlStr = file_get_contents('some_xml.xml'); 
$xml = new SimpleXMLElement($xmlStr); 

$items = $xml->xpath("//channel/item");

$urls_by_item = array();
foreach($items as $x) {
    $urls_by_item [] = $x->xpath("//gdacs:resources/gdacs:resource[@type='image']/@url");
} 

答案 1 :(得分:1)

考虑使用带有方括号[]的xpath节点出现来将网址与对应的titles对齐。对@Daniel Batkilin的回答进行了更为复杂的修改,您可以将这两个数据合并到一个关联的多维数组中,需要嵌套的for循环。

$xml = simplexml_load_file('http://www.gdacs.org/xml/rss.xml'); 
$xml->registerXPathNamespace('gdacs', 'http://www.gdacs.org');

$items = $xml->xpath("//channel/item");

$i = 1;
$out = array();
foreach($items as $x) {       

    $titles = $xml->xpath("//channel/item[".$i."]/gdacs:resources/gdacs:resource[@type='image']/gdacs:title");
    $urls = $xml->xpath("//channel/item[".$i."]/gdacs:resources/gdacs:resource[@type='image']/@url");

    for($j=0; $j<count($urls); $j++) {

        $out[$j.$i]['title'] = (string)$titles[$j];
        $out[$j.$i]['url'] = (string)$urls[$j];                    

    }

    $i++;
}

$out = array_values($out);
var_dump($out);

ARRAY DUMP

array(40) {
  [0]=>
  array(2) {
    ["title"]=>
    string(21) "Storm surge animation"
    ["url"]=>
    string(92) "http://webcritech.jrc.ec.europa.eu/ModellingCyclone/cyclonesurgeVM/1000226/final/outres1.gif"
  }
  [1]=>
  array(2) {
    ["title"]=>
    string(26) "Storm surge maximum height"
    ["url"]=>
    string(101) "http://webcritech.jrc.ec.europa.eu/ModellingCyclone/cyclonesurgeVM/1000226/final/P1_MAXHEIGHT_END.jpg"
  }
  [2]=>
  array(2) {
    ["title"]=>
    string(12) "Overview map"
    ["url"]=>
    string(64) "http://dma.gdacs.org/saved/gdacs/tc/1000226/clouds_1000226_2.png"
  }
  [3]=>
  array(2) {
    ["title"]=>
    string(41) "Map of rainfall accummulation in past 24h"
    ["url"]=>
    string(70) "http://dma.gdacs.org/saved/gdacs/tc/1000226/current_rain_1000226_2.png"
  }
  [4]=>
  array(2) {
    ["title"]=>
    string(23) "Map of extreme rainfall"
    ["url"]=>
    string(62) "http://dma.gdacs.org/saved/gdacs/tc/1000226/rain_1000226_2.png"
  }
  [5]=>
  array(2) {
    ["title"]=>
    string(34) "Map of extreme rainfall (original)"
    ["url"]=>
    string(97) "http://www.ssd.noaa.gov/PS/TROP/DATA/ETRAP/2015/NorthIndian/THREE/2015THREE.pmqpf.10100000.00.GIF"
  }

...