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

Владимир | | PHP, Web разработка.

Логотип статьи об обработке 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). Результат выполнения скрипта показан на скриншоте.

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

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

Удачи!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • MAX

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

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

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

  • MAX

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

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

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

  • MAX

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

    • Готово.

      • Serpanok

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

  • MAX

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Nik

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

  • Nik

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

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

  • Парсинг через 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

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

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

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

  • Николай

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

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

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

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

  • zdfb

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

    Call-time pass-by-reference has been deprecated

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

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

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

  • zdfb

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

    Call-time pass-by-reference has been deprecated

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

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

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

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

    [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

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

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

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

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

    [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

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

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

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

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

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

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

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

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

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

  • Вячеслав

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

  • Вячеслав

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

  • jorik

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

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

      • Андрей

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

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

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

  • jorik

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

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

      • Андрей

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

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

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

  • Андрей

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

    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

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

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

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

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

    • Отправил.

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

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

    • Отправил.

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

  • Ruslannnn

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

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

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

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

  • Ruslannnn

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

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

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

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

  • Александр

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

  • Александр

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

  • Михаил

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

  • Михаил

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

  • Ирина

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

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

  • Ирина

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

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

  • Ирина

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

  • Ирина

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

  • Ирина

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

  • Ирина

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

  • Ирина

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

  • Ирина

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

  • Ирина

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

  • Ирина

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

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

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

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

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

  • Сергей

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

  • Сергей

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

  • Сергей

    PHENOMENA cloudiness=»3"

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

  • Сергей

    PHENOMENA cloudiness=»3"

    • Если вы используете скрипт из этой статьи, то нужно в 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, а по частям.

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

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

  • Сергей

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

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

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

  • Михаил

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

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

      • Михаил

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

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

      • Михаил

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

        • Михаил

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

  • Михаил

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

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

      • Михаил

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

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

      • Михаил

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

        • Михаил

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

  • Михаил

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

    • Тогда нужно использовать оператор 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 и т.д.

    • Тогда нужно использовать оператор 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

  • wermutb

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

  • anton

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

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

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

  • anton

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

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

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

  • Ali

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

  • Ali

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

  • Stanislav

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

  • Stanislav

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

  • elo4ka

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

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

  • elo4ka

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

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

  • elo4ka

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

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

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

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

  • elo4ka

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

  • elo4ka

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

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

    По фразам «не получается» и «не работает» я найти ошибку не смогу 🙂

  • Ребят, помогите, не получается, пустой белый фон выдаёт, в начале поставил две $res = » «; вместо одной $res = «; 🙁

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

  • Dmytro

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

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

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

  • YURBAN

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

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

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

    • Используйте отладчик. Или расставьте 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°

    Зарание сп!

    • Т.е. нужно выводить температуру только для 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 Заранее огромное спасибо!

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

  • 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 и тд)

  • Phenomus

    Добрый день!

    У меня вопрос, раздел 
    FORECAST в данном случае, имеет 4 значения, как каждую строчку внести в отдельную переменную. То есть,
    строка «Температура 14.6.2008 в 3-00 будет от 14 до 16» припустим вносится в переменную $a;, а строка «Температура 14.6.2008 в 15-00 будет от 23 до 25» будет вносится в переменную $b;

    • Наверное, проще всего так:
      1) переменную $res делаем массивом $res=array()
      2) в строке 16
      $res[] = 'Температура '.$attrs['DAY']…
      3) в строке 57
      $a = $res[0];
      $b = $res[1];
      и т.д.

      Хотя, я не вижу смысла присваивать элементы массива переменным.

  • Гость

    Говно какое-то.