2015-10-09 166 views
2

我正在努力閱讀使用PHP的XML文件。從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。

回答

1

考慮使用帶有方括號的xpath的節點出現[]來將url與相應的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" 
    } 

... 
2

通過XML運行常規路徑,從我的經驗來看,速度緩慢而且令人難以忍受。

看一看到的XPath - >這是一個方法來提取,通過選擇從XML數據(類似於CSS選擇器)

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"); 
} 
+0

這個工作,但問題是,我得到的所有網址,所有的項目,我需要到特定的URL分配給特定項目,如果你看看在整個文件中,XML包含許多「項目」節點,我需要爲每個「項目」獲取類型爲「image」的資源的URL。您建議的解決方案會在整個XML文件中生成所有xx類型資源的數組,而不管它們屬於哪個項目 – Jachym

+0

爲每個項目單獨創建一個SimpleXMLElement,然後在循環中爲每個項目運行xpath。您可以使用2個xpath語句 - >第一個獲取所有項目,下一個使用上面的代碼循環遍歷結果 – DannyZB