Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбор XML. Дубль 2 (продолжение)
 
 автор: Zilog   (18.01.2007 в 20:57)   письмо автору
 
 

Итак, пока мы упёрлись тут
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=30985&page=1
в кодировку, я нашёл человеческий способ разбора XML, без всяких монстроподобных строчек. Вот (SimpleXML):
http://www.ibm.com/developerworks/ru/library/x-simplexml/index.html
помоему, это то, что нужно.

Но из предыдуще темый остались вопросы - что делать с кодировкой?
1) первести весь сайт в UTF-8 или оставить в win-1251?
2) если переводить в UTF-8 - как это сделать для всего сайта? Учитывая что используются ещё и БД.
3) Всё таки, как решить проблему, изложенную в прошлой теме - перевести именно XML в win-1251?

И - самое главное. Примеры из SimpleXML - работают, однако не получается заставить их работать на себя. В частности:

Вот XML источник, погода:
http://informer.gismeteo.ru/xml/27612_1.xml

И вот, я пытаюсь для примера, что бы понять суть происходящего, вытащить значение:


$xml = simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml'); 
$xml->MMWEATHER->REPORT as $report;
echo $report['type']; 


и.... неработает, собака! Почему???

да... в XML строчные/прописные буквы роль играют? (мне кажется да, но хочу заручится поддержкой спецов).

зы. Помогите, пожалуйста, заварочному чайнику!.... :) Третьи сутки маюсь уже...

   
 
 автор: Sergey89   (18.01.2007 в 21:09)   письмо автору
 
   для: Zilog   (18.01.2007 в 20:57)
 

Оставить всё на Windows-1251 и
<?php
header
('Content-type: text/html; charset=windows-1251'); 
$xml file_get_contents("http://informer.gismeteo.ru/rss/37789.xml"); 

$dom DOMDocument::loadXML($xml);
$dom->validateOnParse true
$list    $dom->getElementsByTagName("item"); 
$city    $dom->getElementsByTagName("title"); 
$img_url $dom->getElementsByTagName("enclosure"); 
$weather $dom->getElementsByTagName("description"); 

$array = array(); 
for ( 
$i 0$i $list->length$i++ ) { 
  
$array[$i]['city']    = $city->item($i 2)->nodeValue
  
$array[$i]['img_url'] = $img_url->item($i)->getAttribute('url'); 
  
$array[$i]['weather'] = $weather->item($i 1)->nodeValue


ob_start();

print_r($array);

$text ob_get_contents();
ob_end_clean(); 

print 
iconv('UTF-8''WINDOWS-1251'$text); 
?>

   
 
 автор: Саня   (18.01.2007 в 21:24)   письмо автору
 
   для: Zilog   (18.01.2007 в 20:57)
 

<?
$xml 
simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml');
print_r($xml);
А потом работайте с этим объектом как с массивом. Но не забывайте что это всё-таки объект.

По поводу кодировки.
Если планируете переводить сайт на несколько языков, то имеет смысл переделать всё на UTF-8. В другом случае оставьте ср1251.

   
 
 автор: Sergey89   (18.01.2007 в 21:35)   письмо автору
 
   для: Саня   (18.01.2007 в 21:24)
 

Ну не прямо же как с массивом =)

<?php
function object2array($object)
{
   
$return NULL;
    
   if(
is_array($object))
   {
       foreach(
$object as $key => $value)
           
$return[$key] = object2array($value);
   }
   else
   {
       
$var get_object_vars($object);
        
       if(
$var)
       {
           foreach(
$var as $key => $value)
               
$return[$key] = object2array($value);
       }
       else
           return 
strval($object); // strval and everything is fine
   
}

   return 
$return;
}
?>

   
 
 автор: Zilog   (18.01.2007 в 21:43)   письмо автору
 
   для: Sergey89   (18.01.2007 в 21:35)
 

Что то ты, Сергей, меня в дебри какие-то уводишь.

Напоминаю, речь идет о SimpleXML .

почему не работает вот это

$xml = simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml');  
$xml->MMWEATHER->REPORT as $report; 
echo $report['type']; 


тогда как в аналогичный пример (номер примера - 5) отсюда - работает.
http://www.ibm.com/developerworks/ru/library/x-simplexml/index.html

зы. Вариант с ДОМом, и какими-то неясными фукциами преобразования массивов - нотметаются сразу. Нужно простое, понятно, человеческое решение.

   
 
 автор: Саня   (18.01.2007 в 21:49)   письмо автору
 
   для: Zilog   (18.01.2007 в 21:43)
 

<?php
$xml 
simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml');
print 
"Погода для города ".urldecode($xml->REPORT->TOWN['sname']).":<br/>";

foreach ( 
$xml->REPORT->TOWN->FORECAST as $obj ) {
  print 
"Температура на ".$obj['day']."/".$obj['month']."/".
        
$obj['year']." ".$obj['hour'].":00 &mdash; ";
  print 
$obj->TEMPERATURE['min']."&deg;..".
        
$obj->TEMPERATURE['max']."&deg;<br/>";
}
Так по-человечески?

   
 
 автор: Zilog   (18.01.2007 в 22:03)   письмо автору
 
   для: Саня   (18.01.2007 в 21:49)
 

Спасибо, добрый человек! Спас.
Пример отлично работает, только я не понял, почему не работало моё "творчество"? :)

И ещё вопрос: если необходимо добраться до элемента, где-то в середине - нельзя обойтись без цикла foreach, указав в [ ] индекс, как при работе с обычными массивами?

   
 
 автор: Саня   (18.01.2007 в 22:13)   письмо автору
 
   для: Zilog   (18.01.2007 в 22:03)
 

Ваше творчество не работало потому, что вы пытались использовать несуществующий объект MMWEATHER.

Можно обойтись и без цикла
print $xml->REPORT->TOWN->FORECAST[2]->TEMPERATURE['min'];

   
 
 автор: Sergey89   (18.01.2007 в 22:18)   письмо автору
 
   для: Zilog   (18.01.2007 в 22:03)
 

<?php
$xml 
simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml');  
print 
$xml->REPORT[0]->attributes()->type;
?>


или

<?php
$xml 
simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml');  
print 
$xml->REPORT[0]['type']
?>


В мане про это написано ;-)

   
 
 автор: Zilog   (18.01.2007 в 22:35)   письмо автору
 
   для: Zilog   (18.01.2007 в 22:03)
 

Спасибо ребята, с последним своим вопросом успел всётаки сам разобраться :))))

Итак, резюмируем: SimpleXML - очень удобная вещь.

зы. 2Саня: а почему я обращался к несуществующему объекту, если он виден в списке??? (при просмотре xml кода в браузере)

   
 
 автор: Sergey89   (18.01.2007 в 22:39)   письмо автору
 
   для: Zilog   (18.01.2007 в 22:35)
 

MMWEATHER - корневой объект, им является $xml, который ты создал вызовом функции simplexml_load_file.

   
 
 автор: Zilog   (19.01.2007 в 01:52)   письмо автору
 
   для: Zilog   (18.01.2007 в 22:03)
 

Ребята, опять застрял.
Вот тут та же погода, только вся информация не в атрибутах, а в тегах. Как её оттуда вытащить?
http://informer.gismeteo.ru/rss/37789.xml

вот что я пробовал - ничего не работает:

print $xml->channel->item[0]->title;

print $xml->channel->title;

echo htmlentities((string) $xml->channel->title);

$xml->channel->item[0]->title as $title; echo $title;

   
 
 автор: Саня   (19.01.2007 в 12:19)   письмо автору
 
   для: Zilog   (19.01.2007 в 01:52)
 

print $xml->channel->item[0]->title;
Это у меня сработало.

   
 
 автор: Zilog   (20.01.2007 в 02:36)   письмо автору
 
   для: Zilog   (19.01.2007 в 01:52)
 

Ребят, возник ещё такой вопрос.

На гисметео погода даётся так:
1. Почасовой прогноз на сутки, 8 позиций;
2. Прогноз на ближайшие три дня; каждый день - четыре позиции (ночь, утро, день, вечер)

причем, порядок позиций постоянно находится в ротации.

Как мне вытащить погоду на "сейчас", и погоду на завтра: днем, ночью? Немогу справиться с ротацией...

   
 
 автор: Саня   (20.01.2007 в 13:47)   письмо автору
 
   для: Zilog   (20.01.2007 в 02:36)
 

Пользуйтесь регулярными выражениями.

   
 
 автор: mozhunt   (21.01.2007 в 17:38)   письмо автору
 
   для: Саня   (20.01.2007 в 13:47)
 

Саня,как с тобой можно связаться еще (аська,емайл?) просто иногда возникают вопросы по PHP, А ты,как я смотрю,разбираешься.

   
 
 автор: Саня   (21.01.2007 в 21:07)   письмо автору
 
   для: mozhunt   (21.01.2007 в 17:38)
 

Лучше задавайте вопросы на форуме. Ответят оперативнее.

   
 
 автор: Zilog   (22.01.2007 в 02:38)   письмо автору
 
   для: Саня   (20.01.2007 в 13:47)
 

>Пользуйтесь регулярными выражениями.

не получается :(((

подскажите, в каком направлении двигаться?

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

может подскажете, к с ротацией справиться?

   
 
 автор: Саня   (22.01.2007 в 13:26)   письмо автору
 
   для: Zilog   (22.01.2007 в 02:38)
 

А есть какая-нибудь определённость в ротации?

   
 
 автор: Natusia   (22.01.2007 в 13:58)   письмо автору
 
   для: Саня   (22.01.2007 в 13:26)
 

Если нужен разбор XML именно с гисметео, то я писала скрипт для погоды на сутки
выводит такую таблицу. http://koni.nov.ru/test2/test.php Только это один из промежуточных вариантов, где окончательный сейчас не вспомню, но если нужно могу поискать

   
 
 автор: Zilog   (23.01.2007 в 05:08)   письмо автору
 
   для: Саня   (22.01.2007 в 13:26)
 

есть, конечно. ротация со сдвигом влево, неактуальный период уничтожается, справа после сдвига появляеется новое поле.

   
 
 автор: кекс   (03.07.2007 в 16:02)   письмо автору
 
   для: Саня   (20.01.2007 в 13:47)
 

подскажите как ими пользоваться в данном случае? интересует как взять погоду всего на 2 дня...

   
 
 автор: user256   (07.07.2007 в 20:27)   письмо автору
 
   для: кекс   (03.07.2007 в 16:02)
 

люди подскажите как от сюда http://informer.gismeteo.ru/xml/27612_1.xml
получить знаки температуры? типа + или - чето все уних просмотрел и не понимаю где они там может их и нету. тогда как их получить? просто щас то ладно стоит к примеру 17 градосов понятно чего а зимой как быть? где брать - помогите плиз

   
 
 автор: user256   (07.07.2007 в 22:59)   письмо автору
 
   для: user256   (07.07.2007 в 20:27)
 

погите кто ни будь очень надо

   
 
 автор: afdm   (07.07.2007 в 23:05)   письмо автору
 
   для: user256   (07.07.2007 в 22:59)
 

помочь не помогу! извини! у самого та же фигня! похоже что никто не дает xml на 3 дня бесплатно!!!!!
тоже жду когда кто-нибудь чё-нибудь дельное напишет!!!! так что давай вместе ждать!!!!!

   
 
 автор: afdm   (08.07.2007 в 10:36)   письмо автору
 
   для: afdm   (07.07.2007 в 23:05)
 

А как же быть с погодой на 3 дня или на 10 или на все две недели????? Кто знает?????

   
 
 автор: mesos   (07.07.2007 в 23:20)   письмо автору
 
   для: user256   (07.07.2007 в 20:27)
 

Логичнее всего предположить, что отрицательные температуры будут выдаваться точно так же, но со знаком минус:

<TEMPERATURE max="-10" min="-12"/>

   
 
 автор: user256   (07.07.2007 в 23:54)   письмо автору
 
   для: mesos   (07.07.2007 в 23:20)
 

спасиб хоть так за ответ надеюсь что оно так и есть. не кто не вкурсе реально оно так выдается или нет?

   
 
 автор: user256   (08.07.2007 в 01:41)   письмо автору
 
   для: user256   (07.07.2007 в 23:54)
 

да точно выводит

<TEMPERATURE max="1" min="-1"/>

проверил щас по северному полюсу спасибо за ответы)))))

   
 
 автор: afdm   (08.07.2007 в 17:09)   письмо автору
 
   для: user256   (08.07.2007 в 01:41)
 

НАРОД!!!!!! ХЭЛП!!!!! Где взять БЕСПЛАТНУЮ погоду на 3 дня! спасибо!!!

   
 
 автор: targa   (09.07.2007 в 00:21)   письмо автору
 
   для: afdm   (08.07.2007 в 17:09)
 

>>НАРОД!!!!!! ХЭЛП!!!!! Где взять БЕСПЛАТНУЮ погоду на 3 дня! спасибо!!!
А я хотел бы знать где можно заказать недорогую погоду хотя бы на день. А то как соберусь на пляж - дождь :(

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования