Очень просто парсер...

1. ШЕДЕВР (13.05.2011 / 14:36)
Вот данные, которые надо взять http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout

это курс валют. данные выводятся по такому типу:

<Valute ID="036">
   <CharCode>AUD</CharCode> 
   <Nominal>1</Nominal> 
   <Name>Австралийский доллар</Name> 
   <Value>4,7622</Value> 
  </Valute>
 <Valute ID="944">
   <CharCode>AZN</CharCode> 
   <Nominal>1</Nominal> 
   <Name>Азербайджанский манат</Name> 
   <Value>5,6974</Value> 
  </Valute>
//и т.д....

как сделать выбор отдельных элементов, например с Valute ID 1 взять данные name и value и вывести на страницу php...

заранее спасибо!

2. KOZZ (13.05.2011 / 14:37)
это же xml.
вроде функция есть в пхп какая то встроенная по парсингу xml

3. ШЕДЕВР (13.05.2011 / 14:40)
ну да... Я не юзал xml, поэтому и спрашиваю :-)

http://nbt.tj/ru/kurs/?c=4&id=28&dm=2011-05-13&lg=ru&export=xml вот тут еще выборка есть.... но сути это не меняет, парсировать не знаю как ;-(

4. KOZZ (13.05.2011 / 14:43)
клац

5. ШЕДЕВР (13.05.2011 / 14:48)
вот здесь хорошо описано: http://grigorieff.ru/?p=183
оказывается легко... хотя помощьопытногокодера не помешает ...

6. ШЕДЕВР (13.05.2011 / 15:14)
<?php
$xmlstr = "http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout"; //путь к xml, здесь ошибка чтения...
$xml = new SimpleXMLElement($xmlstr); // генерация пых кода из xml
echo $xml->Valute[0]->Name; // вывыод
?>

Добавлено через 00:14 сек.
не работает(( в чем проблема

7. Алексей (13.05.2011 / 15:51)
  $valute = simplexml_load_file("http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout");
  
  print_r($valute->Valute[0]);


8. smartvbxos7 (13.05.2011 / 15:53)
Скрипт в зц поищи я выкладывал для wm || rotor

9. ШЕДЕВР (13.05.2011 / 20:06)
а как сделать этот же вывод отдельно без вывода всех переменных в массиве? т.е. отдельно через echo....
СПАСИБО!

10. Дмитрий (13.05.2011 / 20:52)
дык, что мешает регулярками отфильтровать, к примеру, содержимое
<Value>4,7622</Value>
и так далее?

11. ШЕДЕВР (13.05.2011 / 20:53)
10. dima.london, помоги это сделать?

12. ШЕДЕВР (13.05.2011 / 22:39)
неужели никто не знает как его вывести :-(

13. ramzes (13.05.2011 / 22:56)
<?php
$sss = file_get_contents('http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout');
preg_match_all('|<([^<\/]+)>([^<]+)<\/|is', $sss, $res);

$l = 0;
foreach($res[2] as $data){
$l++;
echo $data.'; ';
if($l==4){ $l = 0; echo'<hr />'; }
}
?>


14. ШЕДЕВР (13.05.2011 / 23:07)
спасибо. а то что кодировка отображает символы не корректно?ты тестировал, у тебя русские буквы показываются?

15. ШЕДЕВР (13.05.2011 / 23:21)
$sss=iconv("cp1251", "utf-8", $sss);
СПАСИБО!

16. ramzes (13.05.2011 / 23:39)
<?php

$sss = iconv('windows-1251', 'utf-8', file_get_contents('http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout')); 
preg_match_all('|<([^<\/]+)>([^<]+)<\/|is', $sss, $res); 
$valute = array();
$l = 0; 

$arr = array();
    foreach($res[2] as $data){
$l++; 
        if($l==1){
$name = $data;
        }
$arr[$name][$l] = $data;
            if($l==4){
$l = 0;
$valute[] = $arr;
$arr = array();
            }
} 


            print_r($valute);
?>
так пожалуй поудобнее будетsmile
_______________
[PKR] => Array ( [1] => PKR [2] => 10 [3] => Пакистанских рупий [4] => 0,5314 )
[PLN] => Array ( [1] => PLN [2] => 1 [3] => Польский злотый [4] => 1,6240 )
[SAR] => Array ( [1] => SAR [2] => 1 [3] => Риал Саудовской Аравии [4] => 1,2014 )
[RUB] => Array ( [1] => RUB [2] => 1 [3] => Российский рубль [4] => 0,1606 )
[XDR] => Array ( [1] => XDR [2] => 1 [3] => СДР [4] => 7,2102 )
[SGD] => Array ( [1] => SGD [2] => 1 [3] => Сингапурский доллар [4] => 3,6163 )

Кеширование необходимо, скорость генерации того файла кошмарная

17. Алексей (14.05.2011 / 08:11)
ramzes (13 Мая 2011 / 23:39)
<?php

$sss = iconv('windows-1251', 'utf-8', file_get_contents('http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout')); 
preg_match_all('|<([^<\/]+)>([^<]+)<\/|is', $sss, $res); 
$valute = array();
$l = 0; 

$arr = array();
    foreach($res[2] as $data){
$l++; 
        if($l==1){
$name = $data;
        }
$arr[$name][$l] = $data;
            if($l==4){
$l = 0;
$valute[] = $arr;
$arr = array();
            }
} 


            print_r($valute);
?>
так пожалуй поудобнее будетsmile
_______________
[PKR] => Array ( [1] => PKR [2] => 10 [3] => Пакистанских рупий [4] => 0,5314 )
[PLN] => Array ( [1] => PLN [2] => 1 [3] => Польский злотый [4] => 1,6240 )
[SAR] => Array ( [1] => SAR [2] => 1 [3] => Риал Саудовской Аравии [4] => 1,2014 )
[RUB] => Array ( [1] => RUB [2] => 1 [3] => Российский рубль [4] => 0,1606 )
[XDR] => Array ( [1] => XDR [2] => 1 [3] => СДР [4] => 7,2102 )
[SGD] => Array ( [1] => SGD [2] => 1 [3] => Сингапурский доллар [4] => 3,6163 )

Кеширование необходимо, скорость генерации того файла кошмарная
это через жопу у тебя както
<?php
  $valute = simplexml_load_file("http://nbt.tj/ru/kurs/?c=4&id=28&lg=ru&d=13-05-2011&export=xmlout");
  
  
  for ( $i=0; $i<=37; $i++ )
	
	{
	    print "<pre>";
		print "Char Code " . $valute -> Valute[$i] -> CharCode . "<br/>";
		print "Nominal " . $valute -> Valute[$i] -> Nominal . "<br/>";
		print "Name " . $valute -> Valute[$i] -> Name . "<br/>";
		print "Value " . $valute -> Valute[$i] -> Value . "<br/>";
		print "</pre>";
	
	}
?>


18. KOZZ (14.05.2011 / 09:31)
17. МегабиТ, ну так у рамзеса то универсальный метод.
<?
print "<pre>"; 
        print "Char Code " . $valute -> Valute[$i] -> CharCode . "<br/>"; 
        print "Nominal " . $valute -> Valute[$i] -> Nominal . "<br/>"; 
        print "Name " . $valute -> Valute[$i] -> Name . "<br/>"; 
        print "Value " . $valute -> Valute[$i] -> Value . "<br/>"; 
        print "</pre>"; 
?>
вот это уже больше похоже на извращение.
зачем для каждой строчки print юзать?
<?
echo "
<pre>
Char Code $valute -> ".Valute[$i]." -> CharCode <br/>; 
Nominal $valute -> ".Valute[$i]." -> Nominal<br/> 
Name $valute -> ".Valute[$i]." -> Name<br/> 
Value $valute -> ".Valute[$i]." -> Value<br/> 
</pre>
"; 
?>


19. Алексей (14.05.2011 / 09:37)
eGo (14 Мая 2011 / 09:31)
17. МегабиТ, ну так у рамзеса то универсальный метод.
<?
print "<pre>"; 
        print "Char Code " . $valute -> Valute[$i] -> CharCode . "<br/>"; 
        print "Nominal " . $valute -> Valute[$i] -> Nominal . "<br/>"; 
        print "Name " . $valute -> Valute[$i] -> Name . "<br/>"; 
        print "Value " . $valute -> Valute[$i] -> Value . "<br/>"; 
        print "</pre>"; 
?>
вот это уже больше похоже на извращение.
зачем для каждой строчки print юзать?
<?
echo "
<pre>
Char Code $valute -> ".Valute[$i]." -> CharCode <br/>; 
Nominal $valute -> ".Valute[$i]." -> Nominal<br/> 
Name $valute -> ".Valute[$i]." -> Name<br/> 
Value $valute -> ".Valute[$i]." -> Value<br/> 
</pre>
"; 
?>
универсальный для чего? есть специальные средства для конкретной задачи, думаешь simplexml не годится для работы с xml?)
print в каждой строке кхм в чём же извращение?

20. ramzes (14.05.2011 / 11:57)
19. МегабиТ, автору предлогали, но его не устроило, он просил регуляркой.
For($i=0; $<37...
Тут вообще гибкостью не пахнет
______
извращение в том что ты принт в 6 раз чаще необходимого вызываешь

21. Алексей (14.05.2011 / 12:30)
ramzes (14 Мая 2011 / 11:57)
19. МегабиТ, автору предлогали, но его не устроило, он просил регуляркой.
For($i=0; $<37...
Тут вообще гибкостью не пахнет
______
извращение в том что ты принт в 6 раз чаще необходимого вызываешь
print вызвать ето прямо ресурсо емкая часть?
For($i=0; $i<=37...
количество валют фиксированно.
если так уж и надо то есть substr_count для подсчета

22. ramzes (14.05.2011 / 12:41)
21. МегабиТ, это не то что емко, это не логично

23. Алексей (14.05.2011 / 12:43)
ramzes (14 Мая 2011 / 12:41)
21. МегабиТ, это не то что емко, это не логично
не логично в чем?

24. ramzes (14.05.2011 / 13:31)
23. МегабиТ, пипец,
тем что вызов
37*6 = 222
это не вызов 37
И дело не в скорости, дело в ненужности подобного.
Ты спросил, я ответил, не более того.
в дальнейшем продолжении дисскусии не вижу смысла.

URL: https://visavi.net/topics/21494