Парсинг PHP simpleXML

Мне нужна конвертация валюты, евро в доллар.
Европейский центральный банк предоставляет курсы здесь:
http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
Я могу получить курс доллара США, используя первый узел, но что, если они изменят порядок?
Нужно ли что-то более надежное? понятия не имею как..

$xml = @simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
echo "dollar: " . $xml->Cube->Cube->Cube[0]->attributes()->rate;

person FFish    schedule 17.03.2010    source источник


Ответы (5)


Просто используйте XPath, чтобы получить любой узел с атрибутом @currency, равным «USD», и это поможет.

$xref  = simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
$nodes = $xref->xpath('//*[@currency="USD"]');

echo $nodes[0]['rate'];
person Josh Davis    schedule 17.03.2010

Они предоставляют пример кода на этой странице:

Просто нажмите на вкладку Для разработчиков.

Существует также (неподдерживаемый) пакет PEAR для обменных курсов.

Вы не должны беспокоиться, если они изменят порядок. Если они делают, они делают.

person Gordon    schedule 17.03.2010

Вы можете перебирать объекты simpleXML с помощью foreach

foreach( $xml->Cube->Cube as $cube ) {
    if( isset( $cube->attributes()->rate ) ) {
         $rate = $cube->attributes()->rate; 
    }    
}
person Andy    schedule 17.03.2010

Вы можете использовать xpath

$rate = $xml->xpath("//Cube[currency='USD']/rate")
person remi bourgarel    schedule 17.03.2010

Ты прав. В настоящее время вы предполагаете, что запись 0th будет USD, и если порядок изменится в будущем, ваше предположение не оправдается. Таким образом, чтобы ваше приложение не зависело от порядка, вы можете проверять атрибут currency в цикле. В тот момент, когда вы найдете один со значением "USD", вы можете получить соответствующий атрибут rate.

person codaddict    schedule 17.03.2010