Чудеса со свойством value в new XMLReader()

server

Новичок
Чудеса со свойством value в new XMLReader()

<?php
$xml = new XMLReader();
$xml->open("http://www.cbr.ru/scripts/XML_daily.asp?date_req=02/03/2002");
while ($xml->read()) {
switch ($xml->name) {
case "Valute":
$data["id"] = $xml->getAttribute("ID");
$xml->read();
break;
case "NumCode":
$data["numcode"] = $xml->value;
$xml->read();
break;
case "CharCode":
$data["charcode"] = $xml->value;
$xml->read();
break;
case "Nominal":
$data["nominal"] = $xml->value;
$xml->read();
break;
case "Name":
$data["name"] = $xml->value;
$xml->read();
break;
case "Value":
$data["value"] = $xml->value;
$xml->read();
break;
} } echo ('<div>');
echo $data["id"]." ".$data["numcode"]." ".$data["charcode"]." ".$data["nominal"]." ".$data["value"]." ".$data["name"]."<br>"; echo('</div>');?>

PHP Version 5.1.6, Apache в комплекте денвера... что не так?
Спасибо...
 

server

Новичок
вот и не знаю, не работает... выводит только ID, а value нет... теперь когда стал пробывать через связку XSL+XML получилось что :
Fatal error: Call to undefined function xslt_create() in y:\home\drupal\www\curs.php on line 54
php_info(); говорит что PHP Version 5.1.6, базовый пакет денвера...

-~{}~ 12.02.07 20:45:

сори про XSL ступил, там библиотека нужна...))
 

Wicked

Новичок
server
1) зачем тебе $xml->read() внутри конструкций case .. break ?
2) $xml->value определено только для нод типа XMLReader::TEXT.
3) то, как ты составляешь массив $data, дало бы тебе все равно только последнюю валюту.
4) echo $data["id"]." ".$data["numcode"]." ".$data["charcode"]." ".$data["nominal"]." ".$data["value"]." ".$data["name"]."<br>";
rtfm [m]print_r[/m](), [m]var_dump[/m]().
5) &laquo;Valute&raquo; - цбр жжот... это на итальянском?
6) имхо инструмент ты выбрал самый неподходящий. Посмотри лучше в сторону [m]DOM[/m].
 

server

Новичок
1.прочитать на следующую позицию...
2.как преобразовать тогда в number
3-5.большое спасибо)))!!!
6. прислушаюсь, посмотрю... спасибо
 

Wicked

Новичок
1.прочитать на следующую позицию...
2.как преобразовать тогда в number

Вообще да, можно, встретив, например, открывающий элемент NumCode, прочитать следующий, который как раз окажется текстовой нодой, и у нее получить value.

Но:
Я не уверен, что ты делал это сознательно, но ты делал это неправильно (потому что бывают еще закрывающие ноды, которые тоже срабатывают в условиях case "NumCode").
И уж тем более я не уверен, что делать так правильно, т.к. в скрипт закладывается лишняя хрупкость.

Вообще, рекомендую запустить скриптик, который тебе для каждого $xml->read() выведет $xml->nodeType, $xml->name, $xml->value. Авось разобрался бы.

Вот только пункт №6 никто не отменял :)
 

x2com

Новичок
Я так понял это курсы валют ЦБР. Т.к. xml там не большой проще DOM'ом (мне кажется) :
PHP:
class CBR_Parser{

var $_pxpref=null;
var $_dom=null;
var $_Xp=null;

function CBR_Parser(&$dom,&$Xp,$tEnc='Windows-1251'){$this->_dom=$dom; $this->_Xp=$Xp; $this->_tEnc=$tEnc;}

// Достаём курс валюты ЦБР
function cbr_getRate(){
$Currencies = $this -> _Xp -> query('/ValCurs/Valute');
$Root = $this -> _Xp -> query('/ValCurs');
if($Currencies && count($Currencies)>0){
$Curr = array();
	$Date = explode('.',$Root->item(0)->getAttribute('Date'));
	$Curr['Date']['d'] = $Date[0];
	$Curr['Date']['m'] = $Date[1];
	$Curr['Date']['Y'] = $Date[2];
foreach ($Currencies as $Key => $Currs) {
	$Curr['res'][$Key] = array();
	$Curr['res'][$Key]['id'] = $Currs -> getAttribute('ID');
foreach($Currs -> childNodes as $items){
	if($items -> nodeName != '#text'){
		if($items->nodeName == 'NumCode')$Curr['res'][$Key]['NumCode'] = trim(iconv('UTF-8',$this->_tEnc,$items -> textContent));
		if($items->nodeName == 'CharCode')$Curr['res'][$Key]['CharCode'] = trim(iconv('UTF-8',$this->_tEnc,$items -> textContent));
		if($items->nodeName == 'Nominal')$Curr['res'][$Key]['Nominal'] = trim(iconv('UTF-8',$this->_tEnc,$items -> textContent));
		if($items->nodeName == 'Name')$Curr['res'][$Key]['Name'] = trim(iconv('UTF-8',$this->_tEnc,$items -> textContent));
		if($items->nodeName == 'Value')$Curr['res'][$Key]['Value'] = trim(iconv('UTF-8',$this->_tEnc,$items -> textContent));
	}
}
}
		return $Curr;
}else	return false;
} // - function

} // - class

$dom = new DomDocument('1.0');
$dom -> load(Адрес до XML);
$Xp = new domxpath($dom);
$Xml = new CBR_Parser($dom,$Xp);
$CBR = $Xml->cbr_getRate();
ptint_r($CBR);
Попробуй...
 

hsasha

Новичок
Юзай simplexml
PHP:
$file=simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=02/03/2002");
foreach ($file->Valute as $val) {

echo$val->NumCode.":";
echo$val->CharCode.":";
echo$val->Nominal.":";
echo$val->Name.":";
echo$val->Value."<br><br><hr>";
}
 
Сверху