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

На сегодняшний день отправка данных в формате 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). Результат выполнения скрипта показан на скриншоте.

Как видите, работать с парсером не сложно, главное правильно написать обработчики.
Удачи!
Понравилась статья? Подписывайтесь на продолжение
!
Добавьте эту страницу в
Tweet
Опубликовано в PHP, Web разработка Комментарии (189) »
Вы можете оставить комментарий. Трекбеки закрыты.
-
http://anton.shevchuk.name/ Anton Shevchuk
-
http://www.simplecoding.org/ Владимир
-
http://anton.shevchuk.name Anton Shevchuk
-
http://anton.shevchuk.name/ Anton Shevchuk
-
http://www.simplecoding.org/ Владимир
-
http://anton.shevchuk.name Anton Shevchuk
-
http://nalivaeff.com/ Nalivaeff
-
http://nalivaeff.com Nalivaeff
-
http://nalivaeff.com/ Nalivaeff
-
http://www.simplecoding.org/ Владимир
-
http://nalivaeff.com Nalivaeff
-
http://sporttovary.com/ MAX
-
http://www.simplecoding.org/ Владимир
-
http://sporttovary.com MAX
-
MAX
-
http://www.simplecoding.org/ Владимир
-
Serpanok
-
http://www.simplecoding.org Владимир
-
MAX
-
http://x-navigator.com/ru/ Влад
-
http://x-navigator.com/ru/ Влад
-
http://chernykh.net/ Gorant
-
http://chernykh.net/ Gorant
-
http://nalivaeff.com/ Nalivaeff
-
http://nalivaeff.com Nalivaeff
-
http://x-navigator.com/ru/ Влад
-
http://x-navigator.com/ru/ Влад
-
http://www.mykatalog.spb.ru/ Scratch
-
http://www.simplecoding.org/ Владимир
-
http://www.mykatalog.spb.ru Scratch
-
http://blog.scode.ru/ SCode
-
http://blog.scode.ru SCode
-
Nik
-
http://www.simplecoding.org/ Владимир
-
Nik
-
http://i-novice.net/ i-novice.net
-
http://i-novice.net i-novice.net
-
Николай
-
Николай
-
Николай
-
http://www.simplecoding.org/ Владимир
-
Николай
-
zdfb
-
http://www.simplecoding.org/ Владимир
-
zdfb
-
http://arviol.ru/gallery Nadz Goldman
-
http://www.simplecoding.org/ Владимир
-
http://arviol.ru/gallery Nadz Goldman
-
http://arviol.ru/gallery Nadz Goldman
-
http://arviol.ru/gallery Nadz Goldman
-
http://all-ebooks.com/ test
-
http://www.simplecoding.org/ Владимир
-
http://all-ebooks.com test
-
http://hlds.us/ maJic
-
http://www.simplecoding.org/ Владимир
-
http://hlds.us maJic
-
Вячеслав
-
http://www.simplecoding.org/ Владимир
-
Вячеслав
-
jorik
-
http://www.simplecoding.org/ Владимир
-
Андрей
-
http://www.simplecoding.org/ Владимир
-
jorik
-
Андрей
-
Андрей
-
Андрей
-
http://www.simplecoding.org/ Владимир
-
http://OtdihayKa.ru/ Евгений
-
http://www.simplecoding.org/ Владимир
-
http://OtdihayKa.ru Евгений
-
Ruslannnn
-
http://www.simplecoding.org/ Владимир
-
Ruslannnn
-
Александр
-
Александр
-
Михаил
-
http://www.simplecoding.org/ Владимир
-
Михаил
-
Ирина
-
http://www.simplecoding.org/ Владимир
-
Ирина
-
Ирина
-
Ирина
-
Ирина
-
Ирина
-
Ирина
-
Ирина
-
Ирина
-
http://www.simplecoding.org/ Владимир
-
Ирина
-
http://harovsk.info/ погода в Харовске
-
http://harovsk.info погода в Харовске
-
http://webalan.ru/ Александр
-
http://webalan.ru/ Александр
-
Сергей
-
Сергей
-
Сергей
-
http://www.simplecoding.org/ Владимир
-
Сергей
-
Сергей
-
Сергей
-
Сергей
-
Сергей
-
Сергей
-
http://www.simplecoding.org/ Владимир
-
Сергей
-
Михаил
-
http://www.simplecoding.org/ Владимир
-
Михаил
-
http://www.simplecoding.org/ Владимир
-
Михаил
-
Михаил
-
Михаил
-
Михаил
-
Михаил
-
Михаил
-
Михаил
-
http://www.simplecoding.org/ Владимир
-
Михаил
-
wermutb
-
http://www.simplecoding.org/ Владимир
-
wermutb
-
anton
-
http://www.simplecoding.org/ Владимир
-
anton
-
Ali
-
Ali
-
Stanislav
-
http://www.simplecoding.org/ Владимир
-
Stanislav
-
elo4ka
-
http://www.simplecoding.org/ Владимир
-
elo4ka
-
elo4ka
-
http://www.simplecoding.org Владимир
-
elo4ka
-
elo4ka
-
http://www.simplecoding.org Владимир
-
http://forum71.ru Gluk
-
http://www.simplecoding.org Владимир
-
Dmytro
-
http://www.simplecoding.org Владимир
-
YURBAN
-
Одиночка Айс
-
http://www.simplecoding.org Владимир
-
Serpanok
-
http://www.simplecoding.org Владимир
-
Ирина
-
http://www.simplecoding.org Владимир
-
http://www.uslaba.ru Burjuev
-
777
-
Ирина
-
Ирина
-
Maxar
-
Maxar
-
Ваше имя
-
Андрей
-
Андрей






