Парсинг XML с помощью PHP скрипта

15 июня, 2008

Логотип статьи об обработке XML

На сегодняшний день отправка данных в формате XML получила очень широкое распространение. Взять хотя бы RSS ленты. Переоценить их значение очень сложно, а ведь по-сути это обычные XML файлы с данными.

Основное преимущество этого способа передачи данных в том, что можно с минимальными усилиями написать обработчик данных и использовать их в своих приложениях. Например, работа практически всех мешапов (mashup) так или иначе, связана с использованием этого формата.

В этой статье я постараюсь показать, что работать с форматом XML действительно не сложно, а польза от его использования огромна.

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

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

Например, gismeteo.ua. Эта служба предоставляет готовые информеры и XML файлы с данными для каждого города.

Подключить информер не сложнее чем обычный баннер, т.е. нужно добавить их HTML код на страницу. Но использование XML данных дает ряд преимуществ.

Во-первых, вы сможете показать данные в том виде, который больше соответствует дизайну сайта.

Во-вторых, такие данные можно легко сохранить и показывать историю изменения погоды за какой-то период, сравнивать данные по городам и т.д. Вариантов тут масса.

Теперь разберем, как получить и обработать эти данные с помощью PHP.

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

Здесь я приведу только его фрагмент.

TOWN информация о пункте прогнозирования:
- index уникальный пятизначный код города
- sname закодированное название города
- latitude широта в целых градусах
- longitude долгота в целых градусах
FORECAST информация о сроке прогнозирования:
- day, month, year дата, на которую составлен прогноз в данном блоке
- hour местное время, на которое составлен прогноз
- tod время суток, для которого составлен прогноз: 0 – ночь 1 – утро, 2 – день, 3 – вечер
- weekday день недели, 1 – воскресенье, 2 – понедельник, и т.д.
- predict заблаговременность прогноза в часах
TEMPERATURE температура воздуха, в градусах Цельсия

Жирным шрифтом выделены названия XML элементов, а курсивом – названия их атрибутов.

Сокращенный фрагмент XML файла выглядит так:

<MMWEATHER>
<REPORT type="frc3">
	<TOWN index="33345" sname="%CA%E8%E5%E2" latitude="50" longitude="30">
	<FORECAST day="14" month="6" year="2008" hour="21" tod="3" predict="18" weekday="7">
		<PHENOMENA cloudiness="3" precipitation="4" rpower="1" spower="0"/>
		<PRESSURE max="739" min="737"/>
		<TEMPERATURE max="21" min="19"/>
		<WIND min="2" max="5" direction="7"/>
		<RELWET max="91" min="86"/>
		<HEAT min="19" max="21"/>
	</FORECAST>
	</TOWN>
</REPORT>
</MMWEATHER>

Как видите данные достаточно легко прочитать даже визуально.

Переходим к обработке. Для формата XML существует множество библиотек, которые позволяют получать данные с помощью всего нескольких строк кода. Мы используем стандартную библиотеку PHP.

Принцип ее работы достаточно простой. Вы создаете парсер (обработчик), передаете ему данные в формате XML и устанавливаете функции-обработчики. После этого запускаете обработку. Парсер просматривает данные и вызывает функции-обработчики для каждого найденного элемента (если они установлены, конечно).

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

<?php
$res = '';

function startElement($parser, $name, $attrs) {
	global $res;
	switch ($name) {
		case 'TOWN':
			$res .= 'Город - ';
			$res .= '<strong>'.mb_convert_encoding(
						urldecode($attrs['SNAME']),
						'UTF-8', 'windows-1251').'</strong><br />';
			$res .= 'широта - '.$attrs['LATITUDE'].' градусов<br />';
			$res .= 'долгота - '.$attrs['LONGITUDE'].' градусов<br />';
			break;
		case 'FORECAST':
			$res .= 'Температура '.$attrs['DAY'].'.'.$attrs['MONTH'].'.'.
				$attrs['YEAR'].' в '.$attrs['HOUR'].'-00 будет от ';
			break;
		case 'TEMPERATURE':
			$res .= '<strong>'.$attrs['MIN'].'°</strong> до <strong>'.
				$attrs['MAX'].'°</strong><br />';
			break;
	}
}

function endElement($parser, $name) {}

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://informer.gismeteo.ua/xml/33345_1.xml');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_PROXY, '192.168.0.1');

$data = curl_exec($ch);

curl_close($ch);

$XMLparser = xml_parser_create();
xml_set_element_handler($XMLparser, 'startElement', 'endElement');
if (!xml_parse($XMLparser, $data)) {
	die('Ошибка обработки данных');
}
xml_parser_free($XMLparser);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Данные от gismeteo</title>
</head>
<body style="font-family:Verdana, sans-serif">
<?php
echo $res;
?>
</body>
</html>

Чтобы немного его упростить данные будем выводить информацию в виде обычной строки (переменная $res).

В начале скрипта мы объявили две функции (startElement и endElement). К ним мы еще вернемся, а сейчас рассмотрим получение данных.

Для этой цели я использовал библиотеку cURL (строки 28-40).

Примечание. Возможно, это и перебор, т.к. получить файл можно с помощью функции fopen(). Но она не работает с прокси, и без cURL пришлось бы использовать сокеты (пример готового скрипта есть в комментариях к этой статье).

В общем, способ получения файла выбираете по своему желанию, а мы переходим к обработке.

Для этого с помощью функции xml_parser_create() создаем XML парсер (строка 42) и затем устанавливаем обработчики элементов (строка 43). Обработчиков у нас два. Первый – startElement будет вызван, когда парсер найдет открывающий тег. Второй – endElement будет вызван для каждого закрывающего тега (этот обработчик я привел только в качестве примера, он ничего не делает, и его можно было опустить).

Формирование данных осуществляет функция startElement. Когда парсер находит очередной элемент, он передает ей его название и массив с атрибутами.

С помощью оператора switch (строки 6-23) мы определяем, какой элемент найден и формируем строку с данными.

Запуск обработки выполняется функцией xml_parse, которой нужно передать парсер и данные из XML файла. Эта функция возвратит TRUE, если обработка пройдет без ошибок.

После окончания работы с парсером его нужно удалить с помощью функции xml_parser_free (строка 47).

В строках 48-60 мы формируем HTML страницу и выводим данные о погоде (строка 57). Результат выполнения скрипта показан на скриншоте.

Скриншот прогноза погоды

Как видите, работать с парсером не сложно, главное правильно написать обработчики.

Удачи!

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в PHP, Web разработка Комментарии (189) »

]]>

Вы можете оставить комментарий. Трекбеки закрыты.

  • http://anton.shevchuk.name/ Anton Shevchuk

    Как по мне – лучше использовать SimpleXML…

    • http://www.simplecoding.org/ Владимир

      По-моему, SimpleXML должен потреблять больше ресурсов, т.к. создает объект с деревом.
      XML Parser читает документ один раз и вызывает обработчики. Конечно, это накладывает свои ограничения, например, нельзя вернуться к предыдущему элементу и нельзя изменить сам xml документ, но если нужно просто найти какие-нибудь данные в документе, то зачем тратить ресурсы?

  • http://anton.shevchuk.name Anton Shevchuk

    Как по мне – лучше использовать SimpleXML…

    • http://www.simplecoding.org/ Владимир

      По-моему, SimpleXML должен потреблять больше ресурсов, т.к. создает объект с деревом.
      XML Parser читает документ один раз и вызывает обработчики. Конечно, это накладывает свои ограничения, например, нельзя вернуться к предыдущему элементу и нельзя изменить сам xml документ, но если нужно просто найти какие-нибудь данные в документе, то зачем тратить ресурсы?

  • http://anton.shevchuk.name/ Anton Shevchuk

    Ну если надо лишь вытащить чуть-чуть данных, то и создавать XML парсер нет необходимости – можно регуляркой (иль strpos) выщемить кусочек необходимых данных…

    • http://www.simplecoding.org/ Владимир

      Согласен, но все-таки с помощью библиотеки удобнее. Переменная с именем элемента, массив с атрибутами, ну и т.д.

  • http://anton.shevchuk.name Anton Shevchuk

    Ну если надо лишь вытащить чуть-чуть данных, то и создавать XML парсер нет необходимости – можно регуляркой (иль strpos) выщемить кусочек необходимых данных…

    • http://www.simplecoding.org/ Владимир

      Согласен, но все-таки с помощью библиотеки удобнее. Переменная с именем элемента, массив с атрибутами, ну и т.д.

  • http://nalivaeff.com/ Nalivaeff

    Спасибо,я использую метод с fopen, но столкнулся с такой проблемой: как сграбить погоду для нескольких дат сразу и вывести их?
    например:

  • http://nalivaeff.com Nalivaeff

    Спасибо,я использую метод с fopen, но столкнулся с такой проблемой: как сграбить погоду для нескольких дат сразу и вывести их?
    например:

  • http://nalivaeff.com/ Nalivaeff

    пример не влез в комментарий, ну вобщем если несколько FORECAST нужно сграбить

    • http://www.simplecoding.org/ Владимир

      Для этого нужен xml файл с прогнозом на несколько дат, а его они не дают. В файле находится 4 блока FORECAST (утро, день, вечер, ночь). Например, если вы запросите файл 16 числа после обеда, то в нем будет прогноз на вечер 16-ого, ночь, утро и день 17-ого.
      Их готовые информеры тоже не показывают долгосрочных прогнозов. Видимо, они хотят чтобы посетители чаще к ним заходили :-)

  • http://nalivaeff.com Nalivaeff

    пример не влез в комментарий, ну вобщем если несколько FORECAST нужно сграбить

    • http://www.simplecoding.org/ Владимир

      Для этого нужен xml файл с прогнозом на несколько дат, а его они не дают. В файле находится 4 блока FORECAST (утро, день, вечер, ночь). Например, если вы запросите файл 16 числа после обеда, то в нем будет прогноз на вечер 16-ого, ночь, утро и день 17-ого.
      Их готовые информеры тоже не показывают долгосрочных прогнозов. Видимо, они хотят чтобы посетители чаще к ним заходили :-)

  • http://sporttovary.com/ MAX

    Простите за то что не в тему, но скопированный код в файл php не работает. Ошибка в строке 9 (по видимому не нравятся ковычки). Подскажите, что нужно изменить

    • http://www.simplecoding.org/ Владимир

      Наверное, кавычки :-)
      Должны быть одинарные или двойные. Любой редактор с подсветкой синтаксиса должен подсветить все, что находится между ними как текст.

      P.S. Если не получится, пишите, вышлю скрипт почтой.

  • http://sporttovary.com MAX

    Простите за то что не в тему, но скопированный код в файл php не работает. Ошибка в строке 9 (по видимому не нравятся ковычки). Подскажите, что нужно изменить

    • http://www.simplecoding.org/ Владимир

      Наверное, кавычки :-)
      Должны быть одинарные или двойные. Любой редактор с подсветкой синтаксиса должен подсветить все, что находится между ними как текст.

      P.S. Если не получится, пишите, вышлю скрипт почтой.

  • MAX

    Вышлите, пожалуйста glebn[at]tut.by
    Спасибо.

    • http://www.simplecoding.org/ Владимир

      Готово.

      • Serpanok

        у меня вобще ничего не отображается, если не трудно и мне вышлите leon29-04-96(ЗОБАГА)yandex.ru

        • http://www.simplecoding.org Владимир

          Отправил.

  • MAX

    Вышлите, пожалуйста glebn[at]tut.by
    Спасибо.

    • http://www.simplecoding.org/ Владимир

      Готово.

  • http://x-navigator.com/ru/ Влад

    Благодарю. Полезная статейка. Сам пользуюсь методом с fopen, сейчас подкорректировал некоторые недочеты по статье.

  • http://x-navigator.com/ru/ Влад

    Благодарю. Полезная статейка. Сам пользуюсь методом с fopen, сейчас подкорректировал некоторые недочеты по статье.

  • http://chernykh.net/ Gorant

    Матерьяльчик интересный. Но я пользуюсь СимплХМЛ

  • http://chernykh.net/ Gorant

    Матерьяльчик интересный. Но я пользуюсь СимплХМЛ

  • http://nalivaeff.com/ Nalivaeff

    2Gorant Это как? Что это такое?

  • http://nalivaeff.com Nalivaeff

    2Gorant Это как? Что это такое?

  • http://x-navigator.com/ru/ Влад
  • http://x-navigator.com/ru/ Влад
  • http://www.mykatalog.spb.ru/ Scratch

    Gorant, а разве с его помощью можно такое сделать?

    • http://www.simplecoding.org/ Владимир

      Да, можно. Фактически SimpleXML имеет большие возможности, т.к. позволяет изменять документ. Просто отличается принцип работы.
      После парсинга SimpleXML возвращает объект с деревом, которое содержит xml документ. Вы можете получить доступ к любому элементу этого дерева, обойти их в цикле, изменить и т.д.

  • http://www.mykatalog.spb.ru Scratch

    Gorant, а разве с его помощью можно такое сделать?

    • http://www.simplecoding.org/ Владимир

      Да, можно. Фактически SimpleXML имеет большие возможности, т.к. позволяет изменять документ. Просто отличается принцип работы.
      После парсинга SimpleXML возвращает объект с деревом, которое содержит xml документ. Вы можете получить доступ к любому элементу этого дерева, обойти их в цикле, изменить и т.д.

  • http://blog.scode.ru/ SCode

    Я предпочту регулярки при маленьких работах.
    Ну а для большого дело вполне возможно и это применять)

  • http://blog.scode.ru SCode

    Я предпочту регулярки при маленьких работах.
    Ну а для большого дело вполне возможно и это применять)

  • Nik

    Добрый день Владимир, Спасибо за разбор парсинга. Но к сожалению у меня тоже вылазит ошибка в 9 строке. Не могли бы Вы скинуть код на мыло 1452(соббака)list.ru Заранее благодарю!

    • http://www.simplecoding.org/ Владимир

      Проверяйте почту :-)

  • Nik

    Добрый день Владимир, Спасибо за разбор парсинга. Но к сожалению у меня тоже вылазит ошибка в 9 строке. Не могли бы Вы скинуть код на мыло 1452(соббака)list.ru Заранее благодарю!

    • http://www.simplecoding.org/ Владимир

      Проверяйте почту :-)

  • http://i-novice.net/ i-novice.net

    Парсинг через xml_parser быстрее, так как он поточный, но от этого и его недостаток в плане удобства использования. Для небольших скриптов вроде этого можно использовать и объектную модель вроде simplexml. Хотя есть еще несколько способов, например XQuery:http://i-novice.net/poisk-v-xml-s-pomoshhyu-xquery/
    или XPath : http://i-novice.net/phpxmlxpath-chast-2/.

  • http://i-novice.net i-novice.net

    Парсинг через xml_parser быстрее, так как он поточный, но от этого и его недостаток в плане удобства использования. Для небольших скриптов вроде этого можно использовать и объектную модель вроде simplexml. Хотя есть еще несколько способов, например XQuery:http://i-novice.net/poisk-v-xml-s-pomoshhyu-xquery/
    или XPath : http://i-novice.net/phpxmlxpath-chast-2/.

  • Николай

    Подскажите пожалуйста что нужно поменять в парсере, чтобы выводились данные конкретных элементов без атрибутов. Например как вывести только название из тега вот из такого файла

    title 2
    news text 2

  • Николай

    Подскажите пожалуйста что нужно поменять в парсере, чтобы выводились данные конкретных элементов без атрибутов. Например как вывести только название из тега вот из такого файла

    title 2
    news text 2

  • Николай

    все теги вырезались((( как вывести название из тега
    title 2
    news text 2

    • http://www.simplecoding.org/ Владимир

      Если кратко – смотрите функцию xml_set_character_data_handler.

      Полный пример можно посмотреть здесь.

      Честно говоря, использовать XML Parser для работы с содержимым тегов не очень удобно. Если xml-файл не очень большой попробуйте SimpleXML. Она потребляет больше ресурсов, но код получается короче.

  • Николай

    все теги вырезались((( как вывести название из тега
    title 2
    news text 2

    • http://www.simplecoding.org/ Владимир

      Если кратко – смотрите функцию xml_set_character_data_handler.

      Полный пример можно посмотреть здесь.

      Честно говоря, использовать XML Parser для работы с содержимым тегов не очень удобно. Если xml-файл не очень большой попробуйте SimpleXML. Она потребляет больше ресурсов, но код получается короче.

  • zdfb

    эти xml классы гребанные не везде работают осторжнее с ними
    таки вот ошибки из за них

    Call-time pass-by-reference has been deprecated

    которые могут запросто повесить сайт

    • http://www.simplecoding.org/ Владимир

      Такие ошибки могут возникнуть не только с этими классами. Настройками в php.ini можно сделать невозможной работу практически любого скрипта.

      В любом случае очень желательно установить локальный сервер с такими же настройками как и у хостера. Тогда можно будет проверить скрипт до переноса на сервер.

  • zdfb

    эти xml классы гребанные не везде работают осторжнее с ними
    таки вот ошибки из за них

    Call-time pass-by-reference has been deprecated

    которые могут запросто повесить сайт

    • http://www.simplecoding.org/ Владимир

      Такие ошибки могут возникнуть не только с этими классами. Настройками в php.ini можно сделать невозможной работу практически любого скрипта.

      В любом случае очень желательно установить локальный сервер с такими же настройками как и у хостера. Тогда можно будет проверить скрипт до переноса на сервер.

  • http://arviol.ru/gallery Nadz Goldman

    Привет. А у меня чего-то не получается.
    Чего-то не понимаю что к чему.
    Не поможете?
    Вот что апач пишет:

    [error] PHP Notice: Undefined variable: res in /usr/local/www/weather/index2.php on li
    ne 2
    [error] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting
    T_STRING or T_VARIABLE or T_NUM_STRING in /usr/local/www/weather/index2.php on line 11

    • http://www.simplecoding.org/ Владимир

      Вы скопировали код со страницы?
      Во второй строке должны быть две одинарные кавычки, а не одна двойная.
      В 11-ой – работа с функцией mb_convert_encoding. Должно быть подключено расширение mbstring (в php.ini).

      • http://arviol.ru/gallery Nadz Goldman

        Уже разобрался.
        Спасибо!

        Полностью разобрал по примеру все дерево. Теперь думаю как переложить на сервер, сняв с клиента.

  • http://arviol.ru/gallery Nadz Goldman

    Привет. А у меня чего-то не получается.
    Чего-то не понимаю что к чему.
    Не поможете?
    Вот что апач пишет:

    [error] PHP Notice: Undefined variable: res in /usr/local/www/weather/index2.php on li
    ne 2
    [error] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting
    T_STRING or T_VARIABLE or T_NUM_STRING in /usr/local/www/weather/index2.php on line 11

    • http://www.simplecoding.org/ Владимир

      Вы скопировали код со страницы?
      Во второй строке должны быть две одинарные кавычки, а не одна двойная.
      В 11-ой – работа с функцией mb_convert_encoding. Должно быть подключено расширение mbstring (в php.ini).

      • http://arviol.ru/gallery Nadz Goldman

        Уже разобрался.
        Спасибо!

        Полностью разобрал по примеру все дерево. Теперь думаю как переложить на сервер, сняв с клиента.

  • http://all-ebooks.com/ test

    интересно, а как оно будет работать с невалидным хмл?

    • http://www.simplecoding.org/ Владимир

      Попробуйте ;)
      У меня всегда выдавало ошибку.

  • http://all-ebooks.com test

    интересно, а как оно будет работать с невалидным хмл?

    • http://www.simplecoding.org/ Владимир

      Попробуйте ;)
      У меня всегда выдавало ошибку.

  • http://hlds.us/ maJic

    Извините, а можно мне выслать тоже?:) majicf@gmail.com
    Заранее огромное спасибо

    • http://www.simplecoding.org/ Владимир

      Отправил.

  • http://hlds.us maJic

    Извините, а можно мне выслать тоже?:) majicf@gmail.com
    Заранее огромное спасибо

    • http://www.simplecoding.org/ Владимир

      Отправил.

  • Вячеслав

    и мне, пожалуйста, отправьте на vyacheslav.pavlov(сцобако)gmail.com

    • http://www.simplecoding.org/ Владимир

      Готово ;)

  • Вячеслав

    и мне, пожалуйста, отправьте на vyacheslav.pavlov(сцобако)gmail.com

    • http://www.simplecoding.org/ Владимир

      Готово ;)

  • jorik

    Хорошая статейка. Но очень было бы интересно если бы был приведён пример разбора этого же файла с применением SimpleXML ;) , а то что то я никак..

    • http://www.simplecoding.org/ Владимир

      Хорошо, учту. Кстати, есть хорошая статья на русском об этой библиотеке.

      • Андрей

        Можете подсказать что надо делать в 11 строке или скинуть на мыло andrewkaraman(at)mail.ru?

        А то плохо знаком с программированием, а делать надо.

        Запустить пытаюсь на локальном компьютере, без cервера. возможно ли вообще тогда запустить?
        php.ini на локале вообще не нашел..

        • http://www.simplecoding.org/ Владимир

          По поводу 11 строки не понял. Там у меня только кодировки указаны. С ними ничего делать не надо.

          На локальном компьютере запустить, конечно, можно. Кстати, именно так я этот скрипт и тестировал. Но web сервер и PHP установить придется ;)
          У меня есть статья Инструменты web разработчика. WAMPSERVER 2 – только новый софт

  • jorik

    Хорошая статейка. Но очень было бы интересно если бы был приведён пример разбора этого же файла с применением SimpleXML ;) , а то что то я никак..

    • http://www.simplecoding.org/ Владимир

      Хорошо, учту. Кстати, есть хорошая статья на русском об этой библиотеке.

      • Андрей

        Можете подсказать что надо делать в 11 строке или скинуть на мыло andrewkaraman(at)mail.ru?

        А то плохо знаком с программированием, а делать надо.

        Запустить пытаюсь на локальном компьютере, без cервера. возможно ли вообще тогда запустить?
        php.ini на локале вообще не нашел..

        • http://www.simplecoding.org/ Владимир

          По поводу 11 строки не понял. Там у меня только кодировки указаны. С ними ничего делать не надо.

          На локальном компьютере запустить, конечно, можно. Кстати, именно так я этот скрипт и тестировал. Но web сервер и PHP установить придется ;)
          У меня есть статья Инструменты web разработчика. WAMPSERVER 2 – только новый софт

  • Андрей

    Может поможете ещё в одном вопросе?

    Fatal error: Call to undefined function: curl_init() in c:serverwwwindex.php on line 41

    Что это может быть?

  • Андрей

    Может поможете ещё в одном вопросе?

    Fatal error: Call to undefined function: curl_init() in c:\server\www\index.php on line 41

    Что это может быть?

  • http://www.simplecoding.org/ Владимир

    В php.ini раскомментируйте строку
    extension=php_curl.dll
    и перезапустите Apache.

  • http://www.simplecoding.org/ Владимир

    В php.ini раскомментируйте строку
    extension=php_curl.dll
    и перезапустите Apache.

  • http://OtdihayKa.ru/ Евгений

    У меня почему-то скрипт выдает пустую страницу!
    Вышлите, пожалуйста, его на e-mail: rabota666@bk.ru

    • http://www.simplecoding.org/ Владимир

      Отправил.

      Обязательно проверьте настройки прокси. Если у вас его нет, нужно закомментировать строки 35 и 36. Если прокси используется в этих строках нужно указать его параметры.

  • http://OtdihayKa.ru Евгений

    У меня почему-то скрипт выдает пустую страницу!
    Вышлите, пожалуйста, его на e-mail: rabota666@bk.ru

    • http://www.simplecoding.org/ Владимир

      Отправил.

      Обязательно проверьте настройки прокси. Если у вас его нет, нужно закомментировать строки 35 и 36. Если прокси используется в этих строках нужно указать его параметры.

  • Ruslannnn

    У меня xml такого вида:

    http : / / s46 . radikal . ru / i111 /0906/17/34c2e1944504.jpg

    Вопрос – как мне вытащить оттуда число 8720 и текст "Lets you modify the connection settings" ? Спасибо.

    • http://www.simplecoding.org/ Владимир

      В этом случае вам удобнее будет использовать SimpleXML. Думаю, пример из этой статьи вам подойдет.

  • Ruslannnn

    У меня xml такого вида:

    http : / / s46 . radikal . ru / i111 /0906/17/34c2e1944504.jpg

    Вопрос – как мне вытащить оттуда число 8720 и текст "Lets you modify the connection settings" ? Спасибо.

    • http://www.simplecoding.org/ Владимир

      В этом случае вам удобнее будет использовать SimpleXML. Думаю, пример из этой статьи вам подойдет.

  • Александр

    В $res записываю информацию почти из всех тегов. Информация располагается в том же порядке, в каком расположены теги в XML. Каким образом можно ее расположить в нужном мне порядке? То есть информацию об атм. давлении расположить после температуры, и т.д. Спасибо заранее

  • Александр

    В $res записываю информацию почти из всех тегов. Информация располагается в том же порядке, в каком расположены теги в XML. Каким образом можно ее расположить в нужном мне порядке? То есть информацию об атм. давлении расположить после температуры, и т.д. Спасибо заранее

  • Михаил

    Вышлите мне пожалуйста
    uvex(at)tut(dot)by

    • http://www.simplecoding.org/ Владимир

      Проверяйте почту.

  • Михаил

    Вышлите мне пожалуйста
    uvex(at)tut(dot)by

    • http://www.simplecoding.org/ Владимир

      Проверяйте почту.

  • Ирина

    Добрый день!!!Может у меня и глупые вопросы, заранее извиняюсь! если не сложно ответьте! Прочитав эту статью, я в принципе всё поняла, только если нужно прогноз погоды для конкретного города, например – Рязань, то нужно лишь прописать параметры в строках 12,13 или как-то через какие-то функции их определять!!!Я новичок в программировании, просто интересно и захотелось попробывать сделать!!!

    • http://www.simplecoding.org/ Владимир

      Нет, для того чтобы изменить город нужно изменить строку 30 (третий параметр функции curl_setopt). Т.е. выбрать нужный файл данных.
      Нужный адрес можно получить на этой странице.

  • Ирина

    Добрый день!!!Может у меня и глупые вопросы, заранее извиняюсь! если не сложно ответьте! Прочитав эту статью, я в принципе всё поняла, только если нужно прогноз погоды для конкретного города, например – Рязань, то нужно лишь прописать параметры в строках 12,13 или как-то через какие-то функции их определять!!!Я новичок в программировании, просто интересно и захотелось попробывать сделать!!!

    • http://www.simplecoding.org/ Владимир

      Нет, для того чтобы изменить город нужно изменить строку 30 (третий параметр функции curl_setopt). Т.е. выбрать нужный файл данных.
      Нужный адрес можно получить на этой странице.

  • Ирина

    Спасибо, сейчас попробую!

  • Ирина

    Спасибо, сейчас попробую!

  • Ирина

    Ещё вопросик!!!А если нужно свой информер создать, а не готовый взять!т .е данные берутся с любого сайта погоды, а как они будут отображаться уже определяю я!Мне нужно, чтобы данные были именно о Рязани!Может туплю, но чего-то никак не могу понять где это прописывать!

  • Ирина

    Ещё вопросик!!!А если нужно свой информер создать, а не готовый взять!т .е данные берутся с любого сайта погоды, а как они будут отображаться уже определяю я!Мне нужно, чтобы данные были именно о Рязани!Может туплю, но чего-то никак не могу понять где это прописывать!

  • Ирина

    Вышлите мне, пожалуйста код на мыло!!!sportwoman_24@mail.ru

  • Ирина

    Вышлите мне, пожалуйста код на мыло!!!sportwoman_24@mail.ru

  • Ирина

    И xml-файл, если можно с комментариями!!!Заранее огромное спасибо….вот пытаюсь разобраться

    • http://www.simplecoding.org/ Владимир

      Отправил, проверяйте почту.

  • Ирина

    И xml-файл, если можно с комментариями!!!Заранее огромное спасибо….вот пытаюсь разобраться

    • http://www.simplecoding.org/ Владимир

      Отправил, проверяйте почту.

  • http://harovsk.info/ погода в Харовске

    В данный момент тоже делаю парсер погоды в городе Харовск с сайта gismeteo.ru. Спасибо за статью.

  • http://harovsk.info погода в Харовске

    В данный момент тоже делаю парсер погоды в городе Харовск с сайта gismeteo.ru. Спасибо за статью.

  • http://webalan.ru/ Александр

    спасибо за способ
    SimpleXML мне не помог когда имя через точку
    тоесть например так

  • http://webalan.ru/ Александр

    спасибо за способ
    SimpleXML мне не помог когда имя через точку
    тоесть например так

  • Сергей

    Скажите, а как вывести облачность с картинками? Она задаётся в XML как http://informer.gismeteo.ru/xml/34504_1.xml но что ни делаю, так и не понял, как же её вытащить.

  • Сергей

    Скажите, а как вывести облачность с картинками? Она задаётся в XML как http://informer.gismeteo.ru/xml/34504_1.xml но что ни делаю, так и не понял, как же её вытащить.

  • Сергей

    PHENOMENA cloudiness="3"

    • http://www.simplecoding.org/ Владимир

      Если вы используете скрипт из этой статьи, то нужно в switch добавить ещё один case:
      case 'PHENOMENA':
      $res .= '<strong>Облачность '.$attrs['cloudiness'].'</strong>;
      break;
      Возможно cloudiness нужно будет написать заглавными буквами
      $attrs['CLOUDINESS']

  • Сергей

    PHENOMENA cloudiness="3"

    • http://www.simplecoding.org/ Владимир

      Если вы используете скрипт из этой статьи, то нужно в switch добавить ещё один case:

      case 'PHENOMENA':
          $res .= '<strong>Облачность '.$attrs['cloudiness'].'</strong>;
          break;

      Возможно cloudiness нужно будет написать заглавными буквами
      $attrs['CLOUDINESS']

  • Сергей

    Спасибо, я в принципе так делал, но в итоге вот такой результат: 26.01.2010 в 20-00 от Облачность 1-19° до -21°, как бы сделать так, чтобы облачность выводилась в конце, пробовал переставлять и так и так, всё-равно не получается.

  • Сергей

    Спасибо, я в принципе так делал, но в итоге вот такой результат: 26.01.2010 в 20-00 от Облачность 1-19° до -21°, как бы сделать так, чтобы облачность выводилась в конце, пробовал переставлять и так и так, всё-равно не получается.

  • Сергей

    Или в начале.

  • Сергей

    Или в начале.

  • Сергей

    Владимир, а ещё лучше подскажите, как выводить не весь результат $res, а по частям.

    • http://www.simplecoding.org/ Владимир

      Объявите несколько переменных, например,
      global $res1;
      global $res2;

      case 'TOWN': …
      $res1 .= ….
      case 'FORECAST': …
      $res2 .= ….

  • Сергей

    Владимир, а ещё лучше подскажите, как выводить не весь результат $res, а по частям.

    • http://www.simplecoding.org/ Владимир

      Объявите несколько переменных, например,
      global $res1;
      global $res2;

      case 'TOWN': …
      $res1 .= ….
      case 'FORECAST': …
      $res2 .= ….

  • Михаил

    Здравствуйте, подскажите как каждый массив в отдельную переменную записать? т.е. переменная для ночи, утра, дня и вечера

    • http://www.simplecoding.org/ Владимир

      $night = array();
      $day = array();
      и т.д.

      • Михаил

        А можно более подробно, я новичек тока учусь, Спасибо Вам огромное

        • http://www.simplecoding.org/ Владимир

          После того, как массивы созданы, вы можете в них записывать данные.
          $night[] = '123';
          $night[] = '456';
          $day[] = '789';
          Я не совсем понимаю, что именно вы хотите сделать.

      • Михаил

        Если не сложно можете пример для одного массива скинуть на почту p642000@yandex.ru Буду очень благодарен Вам

        • Михаил

          Хочу сделать чтоб полнок информаия для ночи была в переменной $night, для дня в $day и т.д.

  • Михаил

    Здравствуйте, подскажите как каждый массив в отдельную переменную записать? т.е. переменная для ночи, утра, дня и вечера

    • http://www.simplecoding.org/ Владимир

      $night = array();
      $day = array();
      и т.д.

      • Михаил

        А можно более подробно, я новичек тока учусь, Спасибо Вам огромное

        • http://www.simplecoding.org/ Владимир

          После того, как массивы созданы, вы можете в них записывать данные.
          $night[] = '123';
          $night[] = '456';
          $day[] = '789';
          Я не совсем понимаю, что именно вы хотите сделать.

      • Михаил

        Если не сложно можете пример для одного массива скинуть на почту p642000@yandex.ru Буду очень благодарен Вам

        • Михаил

          Хочу сделать чтоб полнок информаия для ночи была в переменной $night, для дня в $day и т.д.

  • Михаил

    Хочу сделать чтоб для каждого времени суток информаия была в переменной для ночи $night, для дня в $day и т.д.

    • http://www.simplecoding.org/ Владимир

      Тогда нужно использовать оператор switch
      switch ($attrs['TOD']) {
      case 0: $night[] = $attrs['YEAR']; //тут записываем нужные данные
      break;
      case 1: $morning[] = $attrs['YEAR']; break;
      case 2: $day[] = $attrs['YEAR']; break;
      case 3: $evening[] = $attrs['YEAR']; break;
      }

  • Михаил

    Хочу сделать чтоб для каждого времени суток информаия была в переменной для ночи $night, для дня в $day и т.д.

    • http://www.simplecoding.org/ Владимир

      Тогда нужно использовать оператор switch

      switch ($attrs['TOD']) {
      	case 0: $night[] = $attrs['YEAR']; //тут записываем нужные данные
      		break;
      	case 1: $morning[] = $attrs['YEAR']; break;
      	case 2: $day[] = $attrs['YEAR']; break;
      	case 3: $evening[] = $attrs['YEAR']; break;
      }
  • wermutb

    Пришлите мне пожалуйста код информера onl собака ua.fm

    • http://www.simplecoding.org/ Владимир

      Отправил

  • wermutb

    Пришлите мне пожалуйста код информера onl собака ua.fm

    • http://www.simplecoding.org/ Владимир

      Отправил

  • anton

    Ошибка обработки данных

    в чем может быть проблема?

    • http://www.simplecoding.org/ Владимир

      Если вы не изменяли код, то такая ошибка возникает если не получен XML файл или он имеет неправильный формат. Проблема может быть как у gismeteo (если это так, то, скорее всего, в ближайшее время всё будет исправлено), так и у вас. Обратите внимание, что в настройках cURL указано подключение через прокси. Если вы его не используете, то закомментируйте строки 35 и 36.

  • anton

    Ошибка обработки данных

    в чем может быть проблема?

    • http://www.simplecoding.org/ Владимир

      Если вы не изменяли код, то такая ошибка возникает если не получен XML файл или он имеет неправильный формат. Проблема может быть как у gismeteo (если это так, то, скорее всего, в ближайшее время всё будет исправлено), так и у вас. Обратите внимание, что в настройках cURL указано подключение через прокси. Если вы его не используете, то закомментируйте строки 35 и 36.

  • Ali

    Регулярки рулят, имхо

  • Ali

    Регулярки рулят, имхо

  • Stanislav

    Ругается на ковычки… скиньте, пожалуйста на почту stas !dot! k !at! mail !dot! ru

    • http://www.simplecoding.org/ Владимир

      Отправил. Проверяйте почту.

  • Stanislav

    Ругается на ковычки… скиньте, пожалуйста на почту stas !dot! k !at! mail !dot! ru

    • http://www.simplecoding.org/ Владимир

      Отправил. Проверяйте почту.

  • elo4ka

    А подскажи те мне пожалуйста как пропарсить список городов их хмл файла и вывести из своё поле со списком. Оч.нада, поможите (

    • http://www.simplecoding.org/ Владимир

      Дайте, пожалуйста, ссылку на xml файл, который вы хотите парсить.

  • elo4ka

    А подскажи те мне пожалуйста как пропарсить список городов их хмл файла и вывести из своё поле со списком. Оч.нада, поможите (

    • http://www.simplecoding.org/ Владимир

      Дайте, пожалуйста, ссылку на xml файл, который вы хотите парсить.

  • elo4ka

    Вот она ссылочка. Может на ящик кините подмогу?( http://booking.kuban.aero/ru/xml/dependence-cit…

  • http://www.simplecoding.org Владимир

    Код будет практически такой же как и в этом примере. Нужно изменить функцию startElement.

    function startElement($parser, $name, $attrs) {    global $res = array();    switch ($name) {        case 'с':            $res[$attrs['c']] = $attrs['n'];            break;    }}

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

  • elo4ka

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

  • elo4ka

    и еще мне прокся не нужна

  • http://www.simplecoding.org Владимир

    Если прокси не нужен, закомментируйте строки 35 и 36.

    По фразам "не получается" и "не работает" я найти ошибку не смогу :)

  • http://forum71.ru Gluk

    Ребят, помогите, не получается, пустой белый фон выдаёт, в начале поставил две $res = " "; вместо одной $res = "; :(

    • http://www.simplecoding.org Владимир

      Причин, вызывающих "пустой белый фон" много :)
      Включите режим отладки для curl
      curl_setopt($ch, CURLOPT_VERBOSE, TRUE)
      выведите полученные данные, например, с помощью var_dump.
      И смотрите что получается.

  • Dmytro

    На Java все делается очень просто. Для этого существует SAX. http://www.saxproject.org/ В общем, очередной раз убеждаешься, php – язык для любителей, для небольших несложных проектов.

    • http://www.simplecoding.org Владимир

      Мне не хочется сравнивать PHP и Java, но в данном случае, код, который вы должны написать практически одинаков.

      Используя SAX нужно создать парсер и реализовать методы startDocument, startElement и т.д. Т.е. сделать то же самое, что и на PHP.

  • YURBAN

    Всё намного проще делается
    http://www.yurban.ru/development/php_xml_parser

  • Одиночка Айс

    У меня не работает ((( Коннектится к файлу, но ничего не показывает, пример полностью, как у тебя.

    • http://www.simplecoding.org Владимир

      Используйте отладчик. Или расставьте var_dump'ы. Ошибку это не исправит, но поможет разобраться где именно возникает проблема.

  • Serpanok

    у меня выводит

    Город – Красный Лиман
    широта – 48 градусов
    долгота – 37 градусов
    Температура 05.12.2010 в 20-00 будет от 0° до 2°
    Температура 06.12.2010 в 02-00 будет от -1° до -3°
    Температура 06.12.2010 в 08-00 будет от -3° до -5°
    Температура 06.12.2010 в 14-00 будет от -1° до -3°

    надо

    Город – Красный Лиман
    широта – 48 градусов
    долгота – 37 градусов
    Температура 05.12.2010 в 20-00 будет от 0° до 2°

    Зарание сп!

    • http://www.simplecoding.org Владимир

      Т.е. нужно выводить температуру только для 20-00 ?
      Попробуйте так

      case 'FORECAST':
      if ($attrs['HOUR'] == 20) {
      $res .= 'Температура '.$attrs['DAY'].'.'.$attrs['MONTH'].'.'.
      $attrs['YEAR'].' в '.$attrs['HOUR'].'-00 будет от ';
      $showTemp = true;
      }
      break;
      case 'TEMPERATURE':
      if ($showTemp == true) {
      $res .= ''.$attrs['MIN'].'° до '.
      $attrs['MAX'].'°
      ';
      $showTemp = false;
      }
      break;

      • Ирина

        Доброго времени суток, Владимир! Решаю похожую учебную задачу, но скопированный пример не желает так просто сдаваться :) Не могли бы вы отправить мне исходник? Eva-Adamovna@yandex.ru Заранее огромное спасибо!

        • http://www.simplecoding.org Владимир

          Отправил

  • http://www.uslaba.ru Burjuev

    Спасибо, давно искал решение проблемы с погодой на сайте

  • 777

    alert("sdfsdf");

  • Ирина

    Доброго времени суток! С вашим кодом опять же выдает:

    Fatal error: Call to undefined function curl_init() in Z:denwerwwwdenwerwether.php on line 28

    В php.ini строка extension=php_curl.dll не закомменчена, что это может быть? Запускаю с Денвера

    • Ирина

      Ошибку устранила установкой обновлений на Денвер))

  • Maxar

    добрый вечер, отличная статья! Подскажите пожалуйста как можно выводить информацию о погоде как тут http://kzn.ru/ . И отправьте исправленный исходник на maxshaydurov@gmail.com. Спасибо заранее!!!

  • Maxar

    добрый вечер, отличная статья! Подскажите пожалуйста как можно выводить информацию о погоде как тут http://kzn.ru/ . И отправьте исправленный исходник на maxshaydurov@gmail.com. Спасибо заранее!!!

  • Ваше имя

    не работает блеать

  • Андрей

    Доброго времени суток. Помогите пожалуйста есть xml файл с данными о базе данных в MySQL  мне надо вытащить эти данные из файла и использовать, ломаю голову уже 2-ой месяц но безуспешно…..(( Помогите пожалуйста.

    P.S. если потребуется сам файл , вышлю.

    • Андрей

      *о базе данных MySQL (host, login, pass, name-table и тд)

]]>
Tweet