PHP SimpleXML парсинг - PullRequest
       33

PHP SimpleXML парсинг

2 голосов
/ 17 марта 2010

Мне нужна конвертация валюты, евро в доллар.
Европейский центральный банк предоставляет ставки здесь:
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;

Ответы [ 5 ]

6 голосов
/ 17 марта 2010

Просто используйте 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'];
2 голосов
/ 17 марта 2010

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

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

Существует также (не поддерживается) пакет PEAR для курсов валют

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

0 голосов
/ 17 марта 2010

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

0 голосов
/ 17 марта 2010

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

$rate = $xml->xpath("//Cube[currency='USD']/rate")
0 голосов
/ 17 марта 2010

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

foreach( $xml->Cube->Cube as $cube ) {
    if( isset( $cube->attributes()->rate ) ) {
         $rate = $cube->attributes()->rate; 
    }    
}
...