2015-10-09 5 views
2

Я борюсь с чтением XML-файла с помощью 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; 

.... это работает отлично.

узлов с «ГРКОМ: хххй» были немного более проблематичны, но я использовал следующий код, который также работает:

$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

это работает, но проблема в том, что я получаю все URLs для всех деталей, мне нужно назначить конкретные адреса для конкретных деталей, если вы смотрите во всем файле XML содержит множество «элементов» узлов, и мне нужно получить для каждого «элемента» URL-адреса ресурсов типа «изображение». Предлагаемое решение создает массив всех ресурсов xx-типа во всем XML-файле независимо от того, к какому элементу они относятся к – Jachym

+0

. Создайте SimpleXMLElement для каждого элемента отдельно, затем запустите xpath для каждого из них в цикле. Вы можете использовать 2 оператора xpath -> сначала выбирает все элементы, а следующий - за результатами, используя код выше – DannyZB

Смежные вопросы