|
|
|
| Итак, пока мы упёрлись тут
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 строчные/прописные буквы роль играют? (мне кажется да, но хочу заручится поддержкой спецов).
зы. Помогите, пожалуйста, заварочному чайнику!.... :) Третьи сутки маюсь уже... | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: Zilog
(18.01.2007 в 20:57)
| |
<?
$xml = simplexml_load_file('http://informer.gismeteo.ru/xml/27612_1.xml');
print_r($xml);
| А потом работайте с этим объектом как с массивом. Но не забывайте что это всё-таки объект.
По поводу кодировки.
Если планируете переводить сайт на несколько языков, то имеет смысл переделать всё на UTF-8. В другом случае оставьте ср1251. | |
|
|
|
|
|
|
|
для: Саня
(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;
}
?>
|
| |
|
|
|
|
|
|
|
для: 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
зы. Вариант с ДОМом, и какими-то неясными фукциами преобразования массивов - нотметаются сразу. Нужно простое, понятно, человеческое решение. | |
|
|
|
|
|
|
|
для: 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 — ";
print $obj->TEMPERATURE['min']."°..".
$obj->TEMPERATURE['max']."°<br/>";
}
| Так по-человечески? | |
|
|
|
|
|
|
|
для: Саня
(18.01.2007 в 21:49)
| | Спасибо, добрый человек! Спас.
Пример отлично работает, только я не понял, почему не работало моё "творчество"? :)
И ещё вопрос: если необходимо добраться до элемента, где-то в середине - нельзя обойтись без цикла foreach, указав в [ ] индекс, как при работе с обычными массивами? | |
|
|
|
|
|
|
|
для: Zilog
(18.01.2007 в 22:03)
| | Ваше творчество не работало потому, что вы пытались использовать несуществующий объект MMWEATHER.
Можно обойтись и без цикла
print $xml->REPORT->TOWN->FORECAST[2]->TEMPERATURE['min']; | |
|
|
|
|
|
|
|
для: 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:03)
| | Спасибо ребята, с последним своим вопросом успел всётаки сам разобраться :))))
Итак, резюмируем: SimpleXML - очень удобная вещь.
зы. 2Саня: а почему я обращался к несуществующему объекту, если он виден в списке??? (при просмотре xml кода в браузере) | |
|
|
|
|
|
|
|
для: Zilog
(18.01.2007 в 22:35)
| | MMWEATHER - корневой объект, им является $xml, который ты создал вызовом функции simplexml_load_file. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: Zilog
(19.01.2007 в 01:52)
| | print $xml->channel->item[0]->title;
Это у меня сработало. | |
|
|
|
|
|
|
|
для: Zilog
(19.01.2007 в 01:52)
| | Ребят, возник ещё такой вопрос.
На гисметео погода даётся так:
1. Почасовой прогноз на сутки, 8 позиций;
2. Прогноз на ближайшие три дня; каждый день - четыре позиции (ночь, утро, день, вечер)
причем, порядок позиций постоянно находится в ротации.
Как мне вытащить погоду на "сейчас", и погоду на завтра: днем, ночью? Немогу справиться с ротацией... | |
|
|
|
|
|
|
|
для: Zilog
(20.01.2007 в 02:36)
| | Пользуйтесь регулярными выражениями. | |
|
|
|
|
|
|
|
для: Саня
(20.01.2007 в 13:47)
| | Саня,как с тобой можно связаться еще (аська,емайл?) просто иногда возникают вопросы по PHP, А ты,как я смотрю,разбираешься. | |
|
|
|
|
|
|
|
для: mozhunt
(21.01.2007 в 17:38)
| | Лучше задавайте вопросы на форуме. Ответят оперативнее. | |
|
|
|
|
|
|
|
для: Саня
(20.01.2007 в 13:47)
| | >Пользуйтесь регулярными выражениями.
не получается :(((
подскажите, в каком направлении двигаться?
у меня только одна идея: брять погоду на несоклько дней вперед, а потом по этим данным выдавать текущую и на завтра. Только вот точности уже никакой не будет...
может подскажете, к с ротацией справиться? | |
|
|
|
|
|
|
|
для: Zilog
(22.01.2007 в 02:38)
| | А есть какая-нибудь определённость в ротации? | |
|
|
|
|
|
|
|
для: Саня
(22.01.2007 в 13:26)
| | Если нужен разбор XML именно с гисметео, то я писала скрипт для погоды на сутки
выводит такую таблицу. http://koni.nov.ru/test2/test.php Только это один из промежуточных вариантов, где окончательный сейчас не вспомню, но если нужно могу поискать | |
|
|
|
|
|
|
|
для: Саня
(22.01.2007 в 13:26)
| | есть, конечно. ротация со сдвигом влево, неактуальный период уничтожается, справа после сдвига появляеется новое поле. | |
|
|
|
|
|
|
|
для: Саня
(20.01.2007 в 13:47)
| | подскажите как ими пользоваться в данном случае? интересует как взять погоду всего на 2 дня... | |
|
|
|
|
|
|
|
для: кекс
(03.07.2007 в 16:02)
| | люди подскажите как от сюда http://informer.gismeteo.ru/xml/27612_1.xml
получить знаки температуры? типа + или - чето все уних просмотрел и не понимаю где они там может их и нету. тогда как их получить? просто щас то ладно стоит к примеру 17 градосов понятно чего а зимой как быть? где брать - помогите плиз | |
|
|
|
|
|
|
|
для: user256
(07.07.2007 в 20:27)
| | погите кто ни будь очень надо | |
|
|
|
|
|
|
|
для: user256
(07.07.2007 в 22:59)
| | помочь не помогу! извини! у самого та же фигня! похоже что никто не дает xml на 3 дня бесплатно!!!!!
тоже жду когда кто-нибудь чё-нибудь дельное напишет!!!! так что давай вместе ждать!!!!! | |
|
|
|
|
|
|
|
для: afdm
(07.07.2007 в 23:05)
| | А как же быть с погодой на 3 дня или на 10 или на все две недели????? Кто знает????? | |
|
|
|
|
|
|
|
для: user256
(07.07.2007 в 20:27)
| | Логичнее всего предположить, что отрицательные температуры будут выдаваться точно так же, но со знаком минус:
<TEMPERATURE max="-10" min="-12"/>
|
| |
|
|
|
|
|
|
|
для: mesos
(07.07.2007 в 23:20)
| | спасиб хоть так за ответ надеюсь что оно так и есть. не кто не вкурсе реально оно так выдается или нет? | |
|
|
|
|
|
|
|
для: user256
(07.07.2007 в 23:54)
| | да точно выводит
<TEMPERATURE max="1" min="-1"/>
|
проверил щас по северному полюсу спасибо за ответы))))) | |
|
|
|
|
|
|
|
для: user256
(08.07.2007 в 01:41)
| | НАРОД!!!!!! ХЭЛП!!!!! Где взять БЕСПЛАТНУЮ погоду на 3 дня! спасибо!!! | |
|
|
|
|
|
|
|
для: afdm
(08.07.2007 в 17:09)
| | >>НАРОД!!!!!! ХЭЛП!!!!! Где взять БЕСПЛАТНУЮ погоду на 3 дня! спасибо!!!
А я хотел бы знать где можно заказать недорогую погоду хотя бы на день. А то как соберусь на пляж - дождь :( | |
|
|
|