выбрать курс валют из XML

webus

Новичок
выбрать курс валют из XML

Уважаемые программисты, помогите пожалуйста выбрать курс казахстанского тенге из XML страницы: http://www.nationalbank.kz/rss/rates_all.xml

Нужен курс (поле <description>значение курса</description>) доллара (<title>USD</title>) и курс евро (<title>EUR</title>)

Нашел для российского рубля решение подобной задачи:

Котировки берутся с сайта http://www.cbr.ru/scripts/XML_daily.asp.
И обрабатываются следующим скриптом:

// Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru
$content = get_content();
// Разбираем содержимое, при помощи регулярных выражений
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
preg_match_all($pattern, $content, $out, PREG_SET_ORDER);
$dollar = "";
$euro = "";
foreach($out as $cur)
{
if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]);
if($cur[2] == 978) $euro = str_replace(",",".",$cur[4]);
}
echo("<p>dollar=$dollar, euro=$euro");
function get_content()
{
// Формируем сегодняшнюю дату
$date = date("d/m/Y");
// Формируем ссылку
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
// Загружаем HTML-страницу
$fd = fopen($link, "r");
$text="";
if (!$fd) echo "Запрашиваемая страница не найдена";
else
{
// Чтение содержимого файла в переменную $text
while (!feof ($fd)) $text .= fgets($fd, 4096);
}
// Закрыть открытый файловый дескриптор
fclose ($fd);
return $text;
}

Не могу понять как правильно написать регулярное выражение для моего случая:
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
 

Sigorma

Новичок
http://www.cbr.ru/scripts/Root.asp?Prtid=DWS
http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx

данные забираем либо [m]cUrl[/m] либо [m]soap[/m] советую сразу тянуть данные из функции название которой оканчивается на XML

получив "убогий" XML разбираем его с помощью SimpleXMLElement::xpath
 

webus

Новичок
Вывел все элементы вот так:

function startElement($parser, $name, $attrs) {
global $depth;
echo str_repeat("&nbsp;", $depth * 3); // отступы
echo "<b>Element: $name</b><br>"; // имя элемента
$depth++; // увеличиваем глубину, чтобы браузер показал отступы
foreach ($attrs as $attr => $value) {
echo str_repeat("&nbsp;", $depth * 3); // отступы
// выводим имя атрибута и его значение
echo 'Attribute: '.$attr.' = '.$value.'<br>';
}
}

function endElement($parser, $name) {
global $depth;
$depth--; // уменьшаем глубину
}

function stringElement($parser, $str) {
if (strlen(trim($str)) > 0) {
global $depth, $name;
echo str_repeat("&nbsp;", $depth * 3); // отступ
echo 'String: '.$str.'<br>'; // выводим строку
}
}


$depth = 0;
$file = "http://www.nationalbank.kz/rss/rates_all.xml";

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "stringElement");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fgets($fp)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
echo "<br>XML Error: ";
echo xml_error_string(xml_get_error_code($xml_parser));
echo " at line ".xml_get_current_line_number($xml_parser);
break;
}
}

xml_parser_free($xml_parser);



Теперь не знаю как мне из них выбрать USD и EUR.
 

RadMax

Новичок
Нужен курс (поле <description>значение курса</description> ) доллара (<title>USD</title> ) и курс евро (<title>EUR</title> )
На всякий случай решил прогнать через цикл и проверить if'ами, а не напрямую обращаться к item по id'шникам, а то кто их знает могут ведь и переставить валюты местами в xml.

PHP:
<?php 
	
	$sContent  = file_get_contents("http://www.nationalbank.kz/rss/rates_all.xml", "r"); 
	$oXml = simplexml_load_string($sContent);
	$iUSD = 0;
	$iEUR = 0;
	foreach($oXml->channel->item AS $oValue) {
		if ($oValue->title == "USD") {
			$iUSD = $oValue->description;
		}
		if ($oValue->title == "EUR") {
			$iEUR = $oValue->description;
		}
	}
	
	echo "Доллар = " . $iUSD . " тенге";
	echo "<br/>";
	echo "Евро   = " . $iEUR . " тенге";
?>
 
Сверху