Здесь я хочу затронуть очень актуальную на данный момент тему - разбор XML файлов.
Почему то в сети понятного мануала на эту тему нет (а может я просто плохо искал =/).
Так что я решил написать, так сказать "пособие для чайников" по парсингу XML на языке PHP.
Все предложения и пожелания просьба отправлять на емейл или писать
в форум Сам код, представленный ниже, снабжен подробными комментариями, так что, я надеюсь, все всем будет понятно.
<?php /*возьмем в качестве примера - новости с сайта МТС. Пусть там формат RSS, но без разницы: rss - это тот же XML */ $link = "http://www.mts.ru/news/rss/"; $depth = array(); //глубина вложенных тегов
/* функции startElement, endElement и characterData определяются программером. В них описано что делать с открывающим тегом, закрывающим и данными между ними соответсвенно. */ function startElement($parser, $name, $attrs) { global $depth,$intag,$dist; /* $intag - внутри ли тега мы находимся. $dist (data exist) - есть ли между тегов данные. */ $dist=0; if($intag==1) echo "<br>"; //если в теге, то новая строка. for ($i = 0; $i < $depth[$parser]; $i++) // отступ для наглядности echo "<font color=ffffff>$i</font>"; echo "[$name]"; $depth[$parser]++; $intag=1; // - теперь уже точно в теге. }
function endElement($parser, $name) { global $depth,$intag,$dist; $depth[$parser]--; if ($dist==0) //если нет данных, то делаем отступ, соответсвующий глубине (для наглядности) { for ($i = 0; $i < $depth[$parser]; $i++) echo "<font color=ffffff>$i</font>"; } $intag=0; //закрылся тег $dist=0; //и данные echo "[/$name]<br>"; }
function characterData($parser, $data) { global $dist,$intag; echo "<font color=ff0000>$data</font>"; if ($intag ==1) //если в теге, то есть данные. $dist=1; }
//создаем парсер $xml_parser = xml_parser_create(); //определяем функции открывающего и закрывающего тегов xml_set_element_handler($xml_parser, "startElement", "endElement"); //и данных xml_set_character_data_handler($xml_parser, "characterData"); //отключаем включенный по умолчанию верхний регистр xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
if (!($fp = fopen($link, "r"))) die("could not open XML input");
//собственно парсинг while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } //не забываем очистить парсер xml_parser_free($xml_parser); ?>
Автор: Юферев Денис.
|