Php использование xml paser functions при работе с шаблонами


Лучший XML-парсер для PHP

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

Недавно я увидел SimpleXML, но я еще не пробовал. Это проще? Какие преимущества и недостатки имеют оба? Какие-либо другие парсеры, которые вы использовали?

Я бы сказал, что SimpleXML берет торт, потому что это, во-первых, расширение, написанное на C, и очень быстрое. Но во-вторых, анализируемый документ принимает форму объекта PHP. Таким образом, вы можете «запросить», как $root->myElement .

Основное различие между XML Parser и SimpleXML заключается в том, что последний не является парсинговым анализатором. SimpleXML построен поверх расширений DOM и загружает весь XML файл в память. XML-анализатор, подобный XMLReader, будет загружать только текущий node в память. Вы определяете обработчики для определенных узлов, которые будут срабатывать при обнаружении Parser. Это быстрее и экономит память. Вы платите за это, не имея возможности использовать XPath.

Лично я нахожу SimpleXml довольно ограниченным (следовательно, простым) в том, что он предлагает по DOM. Вы можете легко переключаться между DOM и SimpleXml, но я обычно не беспокоюсь и напрямую направляюсь по маршруту DOM. DOM — это реализация DOM API W3C, поэтому вы можете быть знакомы с ним с других языков, например JavaScript.

Парсинг и обработка веб-страницы на PHP: выбираем лучшую библиотеку

Задача спарсить и обработать необходимую информацию со стороннего сайта встает перед веб-разработчиком довольно часто и по самым разнообразным причинам: таким образом можно заполнять свой проект контентом, динамически подгружать какую-то информацию и так далее.

В таких случаях перед программистом встает вопрос: какую из десятков библиотек выбрать? В этой статье мы постарались рассмотреть самые популярные варианты и выбрать из них лучший.

Регулярные выражения

Даже не смотря на то, что «регулярки» — это первое, что приходит на ум, использовать их для настоящих проектов не стоит.

Да, с простыми задачами регулярные выражения справляются лучше всех, но его использование значительно затрудняется, когда нужно спарсить большой и сложный кусок HTML-кода, который, к тому же, не всегда соответствует какому-то определенному шаблону и вообще может содержать синтаксические ошибки.

21 ноября в 19:00, Москва, беcплатно

Вместо «допиливания» своего регулярного выражения при каждом малейшем изменении кода рекомендуем использовать инструменты ниже — это и проще, и удобнее, и надежнее.

XPath и DOM

DOM и XPath не являются библиотеками в привычном смысле этого слова, это стандартные модули, которые встроены в PHP начиная с пятой версии. Именно отсутствие необходимости использовать сторонние решения делает их одними из лучших инструментов для парсинга HTML страниц.

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

Вот, например, код с использованием DOM и XPath, который ищет в разметке все теги и модифицирует их атрибуты src :

Тем не менее, данный вариант не лишен минусов — для парсинга используется движок, в первую очередь предназначенный для работы с XML, а XML и HTML хоть и являются очень похожими языками, но всё же различаются. Из этого вытекают специфические требования к разметке: например, все HTML теги должны быть закрыты.

Simple HTML DOM

Simple HTML DOM — PHP-библиотека, позволяющая парсить HTML-код с помощью удобных jQuery-подобных селекторов.

Она лишена главного недостатка XPath — библиотека умеет работать даже с невалидным HTML-кодом, что значительно упрощает работу. Вы также забудете о проблемах с кодировкой: все преобразования выполняются автоматически.

Как и JQuery, Simple HTML DOM умеет искать и фильтровать вложенные элементы, обращаться к их атрибутам и даже выбирать отдельные логические элементы кода, например, комментарии.

В этом примере сначала подгружается, а потом модифицируется заранее заготовленный HTML-код: во второй строке происходит добавление атрибута class со значением bar первом попавшемуся элементу div , а в следующей строке мы заменяем текст элемента с > на foo .

Несмотря на не самую высокую производительность, по сравнению с другими вариантами, Simple HTML DOM имеет самое большое русскоязычное комьюнити и наибольшую распространенность в рунете — для новичков это делает написание кода с её использованием значительно проще.

phpQuery

Как и Simple HTML DOM, phpQuery является PHP вариантом JQuery, но на этот раз более похожим на своего «старшего javascript-брата».

Портировано почти всё, что есть в JS-фреймворке: поддержка селекторов, атрибутов, манипуляций, обхода, плагинов, событий (в том числе имитации кликов и т.д.) и даже AJAX. Использовать можно как через PHP, так и через командную строку в виде отдельного приложения.


Более того, согласно нашим бенчмаркам, phpQuery оказался в 8 (!) раз быстрее Simple HTML DOM.

Вот небольшой пример на phpQuery, в котором происходит обработка заранее выбранных элементов списка ( li ):

Подробную документацию и больше примеров найдете на официальной странице в Google Code.

htmlSQL

htmlSQL — экспериментальная PHP библиотека, позволяющая манипулировать HTML-разметкой посредством SQL-подобных запросов.

Простейший пример, извлекающий атрибуты href и title всех ссылок (элементы a ) с классом list :

Как и с обычными mysql_ функциями, воспользовавшись методами fetch_array() или fetch_objects(), мы можем получить результат выполнения данного запроса в виде привычного ассоциативного массива или объекта.

Стоит также упомянуть о высоком быстродействии htmlSQL: часто она справляется в несколько раз быстрее phpQuery или того же Simple HTML DOM.

Тем не менее, для сложных задач вам может не хватить функциональности, а разработка библиотеки давно прекращена. Но даже несмотря на это, она всё ещё представляет интерес для веб-разработчиков: в ряде случаев значительно удобнее использовать язык SQL вместо CSS-селекторов. Особенно когда вы не знаете, что такое CSS-селекторы ��

Вывод

В своем мини-исследовании мы пришли к выводу, что в большинстве случаев для парсинга лучше использовать библиотеку phpQuery: она быстрая, функциональная и современная.

С другой стороны, для совсем простых задач логично было бы использовать стандартные модули PHP, такие как XPath, DOM или, на крайний случай, регулярные выражения.

Что-то ещё?

Для PHP существуют ещё десятки разнообразных библиотек и инструментов для парсинга, но в этой статье мы рассмотрели только самые интересные, функциональные и производительные.

Подробнее о других способах парсинга средствами PHP можно прочитать в соответствующей теме на StackOverflow.

Если вы не используете PHP, то можете ознакомится с кратким списком похожих инструментов для других языков программирования:

Блог WEB-разработчика о PHP, MySQL, JavaScript и разработке

Использование XML в PHP

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

Приступим. Не хочу я нудно и долго рассказывать общие слова про то, как работать с XML в PHP, лучше давайте разберем это все на примере. Итак, постановка задачи: написать скрипт, который будет показывать структуру XML-документа. В примерах это файл xml.php.

Сначала создадим XML-документ (в примерах это test.xml). Пусть в этом файле будут описываться фотографии. Особо мудрить мы не будем, и обойдемся без описания DTD (не путать с DDT :)). Здесь появляется первая неприятная особенность PHP: XML-документы, которые должны обрабатываться из скрипта могут буть написаны в следующих кодировках: US-ASCII, ISO-8859-1 и UTF-8. Т.к. нам нужно описывать фотографии по-русски, то придется выбрать последнюю кодировку, т.к. в первых друх нет русских букв. Не все текстовые редакторы могут работать с этой кодировкой. Я, например, набирал XML в редакторе SciTE. Он маленький, бесплатный и у него хорошая подсветка синтаксиса (в том числе PHP и XML). Наш XML-документ будет выглядеть так:

“Физический” смысл тегов в XML сейчас значения не имеет (хотя там вроде и так все понятно). Единственное, что только здесь может обозначать цветная фотка или нет. Это здесь только для примера тега, у которого нет закрывающегося.

Илон Маск рекомендует:  Что такое код pg_client_encoding

А теперь напишем скрипт, который показывал бы структуру XML-документа. Для работы с XML в PHP есть больше 20 функций. Рассмотрим для начала самые необходимые. Вот этот скрипт:

$name ”;
foreach ($attribs as $atname => $val)
<
echo encoding(“$atname => $val”);
>
echo “>
”;
$level++;
>

// Обрабатывает закрывающиеся теги
function endhandler ($parser, $name)
<
global $level;
global $list;
array_pop($list);
$level–;
drawspace();
echo “ /$name >

// Создадим парсер
$parser = xml_parser_create($code);
if (!$parser)
<
exit (“Не могу создать парсер”);
>
else
<
echo “Парсер успешно создан

// Установим обработчики тегов и текста между ними
xml_set_element_handler($parser, ‘starthandler’, ‘endhandler’);
xml_set_character_data_handler($parser, ‘characterhandler’);

// Откроем файл с xml
$fp = fopen ($xmlfilename, “r”);
if (!$fp)
<
xml_parser_free($parser);
exit(“Не могу открыть файл”);
>


while ($data = fread($fp, 4096))
<
if (!xml_parse($parser, $data, feof($fp)))
<
die(sprintf(“Ошибочка вышла: %s в строке %d”,
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
>
>

fclose ($fp);
xml_parser_free($parser);
?>

После объявлений вспомогательных функций, необходимо в первую очередь создать парсер. Это можно сделать одной из функциий xml_parser_create или xml_parser_create_ns. Первая имеет один необязательный параметр, который обозначает кодировку, в которой написан XML-документ. Если его не указать, то по-умолчанию считается, что он написан как ISO-8859-1. Но, как я писал выше, это нам не подходит и мы выбирает UTF-8. Т.к. обозначение этой кодировки нам еще понадобится, то вынесем ее в глобальную переменную ($code = “UTF-8″;). Также вынесем туда кодировку, в которой будет выводиться текст в браузер ($curcode = “Windows-1251″;). Функция xml_parser_create_ns имеет дополнительный (тоже необязательный) параметр, который обозначает символ, которым в документе будут разделяться пространства имен. Т.к. нам сейчас это не надо, то мы воспользовались первой функцией. Если парсер создан успешно, то паременная $parser получит значение, отличное от нуля.

После этого надо указать парсеру XML, какие функции вызывать при появлении в тексте тегов XML. В нашем примере это сделано так:

// Установим обработчики тегов и текста между ними
xml_set_element_handler($parser, ‘starthandler’, ‘endhandler’);
xml_set_character_data_handler($parser, ‘characterhandler’);

Функция xml_set_element_handler устанавливает обработчики для открывающихся и закрывающихся тегов. В качестве первого параметра им передается парсер, который мы создали до этого. А в качестве второго и третьего – имена функций, которые будут вызываться по мере того, как будут попадаться открывающиеся и закрывающиеся тего соответственно. Эти функции должны быть определены определенным образом. Функция для открывающихся тегов должна выглядеть примерно так:

// Обрабатывает открывающиеся теги
function starthandler ($parser, $name, $attribs)
<
>

При ее вызове ей передаются парсер, который мы создали, имя обрабатываемого тега и его атрибуты (то, что находится в угловых скобках после имени). Если с именем никаких особенностей нет, то атрибуты передаются как ассоциативный массив, т.е. в виде ключ => значение. Поэтому мы их и обрабатываем следующим образом:

foreach ($attribs as $atname => $val)
<
echo encoding(“$atname => $val”);
>

Все тоже самое и для закрывающихся тегов, только функции не передаются атрибуты, которых в принципе быть не может у закрывающегося тега:

function endhandler ($parser, $name)
<
>

Тут есть одна интересная деталь. Даже если у тега нет закрывающегося, то вторая функция все-равно вызывается. Если Вы посмотрите на работу скрипта, то увидите, что для тега у нас получилось:

А чтобы обрабатывать текст, который располагается между тегами, надо установить соответствующий обработчик функцией xml_set_character_data_handler. Ей пользоваться точно так же, только ее вторым аргументом должно быть имя функции, которая объявлена таким образом:
function characterhandler ($parser, $data)

То есть так же, как и для закрывающегося тега. Именно в нее передаются все данные наподобие “Название 1″ или “Длинный комментарий на несколько строк 2″ из нашего примера. Ну и, наконец, самое главное – как читать XML-документ. Оказывается просто – как обычный текстовый файл. Т.е. открываем его функцией fopen, например так:
$fp = fopen ($xmlfilename, “r”);

И читаем из него все строки, которые потом передаем в функцию xml_parse:
while ($data = fread($fp, 4096))
<
if (!xml_parse($parser, $data, feof($fp)))
<
die(sprintf(“Ошибочка вышла: %s в строке %d”,
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
>
>

У xml_parse три аргумента. Первый – переменная созданного нами раньше парсера, второй – прочитанная строка, а третий (необязательный) – признак того, что пора заканчивать парсить (вот мы туда и передаем значение того, кончился ли файл). У нас еще вставлена проверка ошибок. Там вроде все ясно из названия. xml_get_error_code возвращает код ошибки, по которому xml_error_string создает строку, которая описывает эту ошибку.

После всего этого надо не забыть уничтожить парсер. Это делается функцией xml_parser_free:
xml_parser_free($parser);

Теперь одна из самых неприятных особенностей. Т.к. мы писали XML как Unicode, то и строки нам передаются в той же кодировке. А так как обычно сайт строят на более привычной кодировке (Koi8, Windows), то с этим Unicod’ом надо что-то делать. И вот здесь начинается самое неприятное. В расширении PHP, которое отвечает за XML, есть две функции для перекодировки UTF-8. Это функция utf8_decode, которая преобразует строку из UTF-8, и функция utf8_encode, которая наоборот преобразует в UTF-8. Но они нам не подходят по той причине, что могут работать с кодировкой ISO-8859-1, в которой нет русских букв. К счастью, разработчики PHP все-таки сделали функции, которые могут буз проблем работать и с другими кодировками – это mb_convert_encoding. В данном случае мы ее использовали так:

$str = mb_convert_encoding($str, $curcode, $code);

$curcode и $code это переменные, в которых храняться названия кодировок (помните, мы их раньше объявили глобальными?). С этой функцией все понятно: первый аргумент – это исходная строка, второй – название кодировки, в которую преобразуем, а третий аргумент (необязательный) – кодировка, из которой преобразуем. Функция возвращает нам новую строку. Казалось бы, что все хорошо, есть функция, она здорово работает (это действительно так), но, чтобы она работала, надо, чтобы было подключено расширение к PHP – mbstring (multi byte string). Для этого, если вы работаете из Windows, в файле php.ini надо раскомментировать строку extension=php_mbstring.dll. Но если дома это сделать несложно, то вот на хостинге, где расположен Ваш сайт, оно (расширение) может быть не подключено. Именно поэтому я вынес перекодировку в отдельную функцию, чтобы ее можно было легко исправить:

// Преобразует строку из Unicode
function encoding ($str)
<
global $code;
global $curcode;

$str = mb_convert_encoding($str, $curcode, $code);
return $str;
>

Если у Вас есть идеи насчет того, как обойтись без mb_convert_encoding – пишите мне

Это были самые простые функции для работы с XML. Чтобы было интереснее, в нашем скрипте я считаю уровень вложенности для тегов (это для того, чтобы правильно смещать текст вправо) и еще в глобальную переменную $list заносятся открывающиеся теги, а при появлении закрывающегося – выбрасывается последний элемент. Т.о. в $list хранится путь по которому мы прошли до текущего тега, а сам этот тег находится в конце списка.

Теперь давайте немного побалуемся и посмотрим, как работает обработка ошибок. Уберем из тега color слеш. То есть оставим , как будто мы забыли его закрыть. И вот что нам выдает PHP: “Ошибочка вышла: mismatched tag в строке 16″. И на этом обработка прекращается. Также “mismatched tag” будет, если мы перенесем закрывающийся тег после тега .

Поиграемся с кодировками. Если сохранить наш XML-документ в кодировке Windows-1251 и честно это указать в заголовке (не забудьте исправить соответствующую глобальную переменную в скрипте), то PHP… благополучно вылетает :) По крайней мере, так было у меня. Я этот скрипт испытывал на такой конфигурации: Win2000 + SP3; Apache 1.3.27; PHP 4.3.1.

Как сделать xml parser (PHP).


Вот и лето пришло и первая неделя июля пролетела незаметно. Через две недели мне защищать свой диплом, а одна из частей его – XML parser. Но жалко, что не в пхп. Ну ниче, счас наверстаем

Я видел много xml parser`ов, но не затрагивал при этом веб-программирование. Теперь же я хочу выяснить и научиться вместе с вами, как сделать простой xml parser в php.

Не, ну на самом деле: xml-файлы – очень полезная штука. И любой профессионал должен… нет, не должен, а обязан знать, как с ними работать. Мы же хотим стать профессионалами? Если Вы на моем блоге, то такое желание у Вас есть.

Мы предполагаем, что знаем, что такое XML и описывать его здесь не будем. Ну, если не знаем, то легко узнаем здесь: http://ru.wikipedia.org/wiki/XML

При поиске способов парсинга XML на PHP, я обнаружил простой набор функций в PHP для работы с XML-файлами, который называется «XML Parser Functions». Парсинг начинается с инициализации парсера вызовом функции xml_parser_create:

Потом нам нужно сказать парсеру, какие функции будут обрабатывать попадающиеся ему xml-теги и текстовую информацию в процессе парсинга. Т.е. нужно установить некие обработчики:

xml_set_element_handler($xml_parser, “startElement”, “endElement”);

Эта функция отвечает за установку обработчиков начала элемента и конца элемента. Например, если в тексте xml-файла встретится комбинация, то функция startElement сработает, когда парсер найдет элемент, а функция endElement – при нахождении.

Илон Маск рекомендует:  Получение информации о MySQL таблице.

Сами же функции startElement и endElement принимают несколько параметров согласно документации по php:

А как же считывать данные из файла? Мы же пока не видели ни одного параметра для этого ни в одной из функций! А об этом дальше: считывание файла возлагается на плечи программиста, т.е. мы должны использовать стандартные функции для работы с файлами:

Открыли файл. А теперь нужно построчно считывать его и скармливать считываемые строки функции xml_parse:

Здесь заметим две очень важные вещи. Первая – это то, что функции xml_parse в третьем параметре нужно передать флаг считывания последней строки (true – если строка последняя, false – если нет). Второе – это то, что как и в любом деле, мы должны следить здесь за ошибками. За это отвечают функции xml_get_error_code и xml_error_string. Первая функция получает код ошибки, а вторая – по полученному коду возвращает текстовое описание ошибки. Что в результате возникновения ошибки получится – рассмотрим позже. Не менее полезная функция xml_get_current_line_number скажет нам номер текущей обрабатываемой строки в файле.

И как всегда мы должны освободить занимаемые системой ресурсы. Для парсинга XML – это функция xml_parser_free:

Вот, основные функции мы рассмотрели. Пора бы посмотреть их на деле. Для этого я придумал xml-файл с очень простой структурой:

Назовем этот файл data.xml и попытаемся его распарсить с помощью следующего кода:

function endElement($parser, $name) <
global $depth;

$depth—; // уменьшаем глубину
>

$depth = 0;
$file = «data.xml»;

if (!($fp = fopen($file, «r»))) <
die(«could not open XML input»);
>

В результате разработанного нами простейшего скрипта браузер вывел в свое окно следующую информацию:

Попробуем испортить XML-файл, заменив тег

на , а закрывающий тег оставив прежним:

XML Error: Mismatched tag at line 5

Ух ты! Сообщения об ошибках работают! Причем довольно информативные.

Эх, я забыл еще одну вещь… Мы же не вывели текст, содержащийся внутри тегов address и phone. Исправляем наш недочет – добавляем текстовый обработчик с помощью функции xml_set_character_data_handler:

И добавляем в код саму функцию-обработчик:

Посмотрим теперь на вывод:

О! Теперь вывели все!


Кстати, кто-нибудь заметил, что имена тегов и атрибутов все большими буквами написаны? Странно… они же в нашем xml-файле малыми буквами обозначены. Видимо где-то какие-то настройки установлены, чтобы делать uppercase…

Ааа, нашел! Оказывается есть еще функция xml_parser_set_option:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);

Таким вызовом мы отменяем вывод имен атрибутов и имен тегов большими буквами:

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

nika, Вам нужно вставить вызов
xml_set_character_data_handler($xml_parser, ’stringElement’);
после
xml_set_element_handler($xml_parser, “startElement”, “endElement”);

В общем для правильного отображения нужно соблюдать следующее:
1. нужно, чтобы xml-файл был в кодировке UTF-8
2. в xml-файле первая строчка должна быть такой:

3. нужно инициализировать парсер так:
xml_parser_create(”UTF-8?);
4. нужно перед выводом содержимого xml-файла в браузер настроить последний на кодировку UTF-8:
header( “Content-Type: text/html; charset=utf-8?);

Для отображения текста на русском языке используем
iconv(”UTF-8?,”windows-1251?, $attr), где $attr, то что нужно вывести.

Есть такие два класса интересных в стандартной библеотеке PHP5 – DOMDocument() и XSLTProcesor() использовал на довольно крупных проектах – не жалуюсь =)

Вообще у PHP есть еще одна библиотечка для разбора XML по принципу SAX – называется XMLReader.

Господа, как вывести из xml с помощью simplexml не стандартные теги, например ?
Переменная вида $text = $item->yandex:full-text не работает.

Все ОК, только обратите внимание на наличие следующего параметра,

function cdata($parser, $cdata)
<
var_dump($parser, $cdata);
>

Без него не хочет парсить XML с CDATA…. размером в 1.5 метра

2Nika, Функция header() работает только в том случае, если до нее не было ничего выведено, то бишь первым действие производили ее, т.к. мы отсылаем заголовки на эту страницу, которые говорят нам, что текст нужно переводить в кодировку UTF-8. Судя по вашей ошибке у вас есть пропуски строк, поэтому сделайте вот так:

Значение == порядковый номер строки

Также почитайте:

Комментарии к посту «Как сделать xml parser (PHP).»

Комментариев пока нет, будьте первым.

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Как получить параметры из XML-файла на PHP?

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

Сегодня на примере одного из таких файлов я покажу, как с помощью PHP получить тот или иной параметр.

Итак, перед нами файл price.xml с примерно такой структурой:

Для теста получим его содержимое, а именно – данные из поля URL:

Вроде бы все просто. А теперь попробуем получить значение, например, параметра «цвет» – и у большинства новичков здесь начинают возникать трудности.


А решается эта проблема довольно просто с помощью использования «XPath» – специального языка, созданного для запросов к элементам XML.

В таком случае мы получаем значение «Синий», что нам и необходимо, а остальные параметры — получаются по аналогии.

PHP SimpleXML Parser

SimpleXML is a PHP extension that allows us to easily manipulate and get XML data.

The SimpleXML Parser

SimpleXML is a tree-based parser.

SimpleXML provides an easy way of getting an element’s name, attributes and textual content if you know the XML document’s structure or layout.

SimpleXML turns an XML document into a data structure you can iterate through like a collection of arrays and objects.

Compared to DOM or the Expat parser, SimpleXML takes a fewer lines of code to read text data from an element.

Installation

From PHP 5, the SimpleXML functions are part of the PHP core. No installation is required to use these functions.

PHP SimpleXML — Read From String

The PHP simplexml_load_string() function is used to read XML data from a string.

Assume we have a variable that contains XML data, like this:

PHP5 XML Parser Functions

PHP XML Parser Introduction

The XML functions lets you parse, but not validate, XML documents.

XML is a data format for standardized structured document exchange. More information on XML can be found in our XML Tutorial.

This extension uses the Expat XML parser.

Expat is an event-based parser, it views an XML document as a series of events. When an event occurs, it calls a specified function to handle it.

Expat is a non-validating parser, and ignores any DTDs linked to a document. However, if the document is not well formed it will end with an error message.

Because it is an event-based, non validating parser, Expat is fast and well suited for web applications.

The XML parser functions lets you create XML parsers and define handlers for XML events.

Installation

The XML functions are part of the PHP core. There is no installation needed to use these functions.

PHP XML Parser Functions

PHP: indicates the earliest version of PHP that supports the function.

Парсинг XML-документа на PHP


В прошлой статье мы с Вами создавали XML-документ через PHP, и я обещал, что в следующей статье мы с Вами будем его парсить. И сегодня я Вам покажу, как можно парсить XML-документ на PHP.

Предлагаю парсить созданный нами в прошлой статье документ, а данные оттуда просто вывести в браузер. Привожу код скрипта:

load(«users.xml»); // Загружаем XML-документ из файла в объект DOM
$root = $dom->documentElement; // Получаем корневой элемент
$childs = $root->childNodes; // Получаем дочерние элементы у корневого элемента
/* Перебираем полученные элементы */
for ($i = 0; $i length; $i++) <
$user = $childs->item($i); // Получаем следующий элемент из NodeList
$lp = $user->childNodes; // Получаем дочерние элементы у узла «user»
$ >getAttribute(«id»); // Получаем значение атрибута «id» у узла «user»
$login = $lp->item(0)->nodeValue; // Получаем значение узла «login»
$password = $lp->item(1)->nodeValue; // Получаем значение узла «password»
/* Выводим полученные данные */
echo «ID: $id
«;
echo «Логин: $login
«;
echo «Пароль: $password
«;
echo «————————
«;
>
?>

Из этого кода Вы должны не только понять, как парсить XML-документ на PHP, но и то, что сам процесс парсинга зависит от структуры документа. То есть Вы должны знать, какова структура, иначе разобрать такой документ будет проблемно. Я уже когда-то писал, что главная особенность XML — это строгость синтаксиса. Надеюсь, Вы теперь понимаете, почему это так важно. Без этой «жёсткости кода» было бы крайне затруднительно парсить документы, а вещь эта очень часто требуется. Элементарно при импорте каких-то данных из XML-файла с последующим размещением их в базе данных.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Илон Маск рекомендует:  Vesa 2 0 программируем в защищенном режиме

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 8 ):

    Михаил, когда я xml-документ проганяю в цикле for ($i = 0; $i length; $i++), то в NodeList попадают еще и переносы строк (nodeName = ‘#text’). Приходится сначала проверять nodeName, а потом уже браться за него. Как такое преодолеть?

    Существует 3 способа. Один из них Вы описали, другой состоит в том, чтобы убрать все эти лишние строки вручную в самом файле. И третий способ заключается в том, чтобы в этот цикл попадали не просто дочерние элементы, а только те, которые нужны. Есть различные методы, которые позволяют вытащить те или иные элементы. Но Вы выбрали, на мой взгляд, лучший и универсальный способ, поэтому его и используйте.

    Михаил, У меня в Вам вопрос! У меня дома 4 компьютера! Один из них я хочу сделать сервером, а не загружать сайт на хостинг! Обьясните пожалуйста как это сделать, что нужно установить или создать и куда закинуть свой сайт! Спасибо.

    Я постараюсь написать об этом статью в ближайшее время.

    Прежде всего надо получить белый IP, чтобы любой компьютер в мире мог обратиться непосредственно к Вашему серверу. Доменное имя нужно будет купить и привязать к Вашему IP (не уверен на 100%, что это так. просто догадываюсь) На сервер надо поставить будет Apache. Скорее всего придется пользоваться ОС Ubuntu или Debian. Debian гораздо более стабильный на мой взгляд. Один мой знакомый держал дома веб-сервер на Debian’e. Аптайм — 5 лет или больше был.

    Здравствуйте Михаил! Обьясните пожалуйста как вставить шаблон сделанный в фотошоп на страницу? Ведь этот шаблон будет картинкой! Тогда как сделать чтобы при нажатии на кнопку например пользователь переходил на другую страницу?

    Это называется вёрстка: http://myrusakov.ru/html-makeup.html Также могу порекомендовать свой курс по вёрстке: http://srs.myrusakov.ru/makeup

    Михаил, подскажите. Приведенный выше код работает отлично. Но стоит мне навести порядок в xml файле — расставить переносы строк и сделать табуляцию, php парсер перестает работать. И выдает ошибку: Fatal error: Call to undefined method DOMText::getAttribute() in Z:\home\school\www\xmlparse\index.php on line 10 И за чего возникает эта ошибка?

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    FPublisher


    Web-технологии: База знаний

    Документация PHP

    xml_parse

    xml_parse — Start parsing an XML document

    Описание

    int xml_parse ( resource $parser , string $data [, bool $is_final ] )

    xml_parse() parses an XML document. The handlers for the configured events are called as many times as necessary.

    Список параметров

    A reference to the XML parser to use.

    Chunk of data to parse. A document may be parsed piece-wise by calling xml_parse() several times with new data, as long as the is_final parameter is set and TRUE when the last data is parsed.

    If set and TRUE, data is the last piece of data sent in this parse.

    Возвращаемые значения

    Returns 1 on success or 0 on failure.

    Замечание: Entity errors are reported at the end of the data thus only if is_final is set and TRUE.

    Как сделать xml parser на PHP

    Я видел много xml parser`ов, но не затрагивал при этом веб-программирование. Теперь же я хочу выяснить и научиться вместе с вами, как сделать простой xml parser в php.

    Не, ну на самом деле: xml-файлы — очень полезная штука. И любой профессионал должен… нет, не должен, а обязан знать, как с ними работать. Мы же хотим стать профессионалами? Если Вы на моем блоге, то такое желание у Вас есть.

    Мы предполагаем, что знаем, что такое XML и описывать его здесь не будем. Ну, если не знаем, то легко узнаем здесь: http://ru.wikipedia.org/wiki/XML

    При поиске способов парсинга XML на PHP, я обнаружил простой набор функций в PHP для работы с XML-файлами, который называется «XML Parser Functions». Парсинг начинается с инициализации парсера вызовом функции xml_parser_create:

    Потом нам нужно сказать парсеру, какие функции будут обрабатывать попадающиеся ему xml-теги и текстовую информацию в процессе парсинга. Т.е. нужно установить некие обработчики:

    Эта функция отвечает за установку обработчиков начала элемента и конца элемента. Например, если в тексте xml-файла встретится комбинация , то функция startElement сработает, когда парсер найдет элемент , а функция endElement — при нахождении .

    Сами же функции startElement и endElement принимают несколько параметров согласно документации по php:

    startElement ( $parser , $name , $attrs ) <
    // $parser — уникальный идентификатор парсера
    // (т.к. мы можем использовать несколько парсеров)
    // $name — имя обнаруженного элемента
    // $attrs — массив атрибутов обнаруженного элемента
    >

    function endElement ( $parser , $name ) <
    // $parser — уникальный идентификатор парсера
    // $name — имя обнаруженного элемента
    >
    ?>

    А как же считывать данные из файла? Мы же пока не видели ни одного параметра для этого ни в одной из функций! А об этом дальше: считывание файла возлагается на плечи программиста, т.е. мы должны использовать стандартные функции для работы с файлами:

    Открыли файл. А теперь нужно построчно считывать его и скармливать считываемые строки функции xml_parse:

    Здесь заметим две очень важные вещи. Первая — это то, что функции xml_parse в третьем параметре нужно передать флаг считывания последней строки (true — если строка последняя, false — если нет). Второе — это то, что как и в любом деле, мы должны следить здесь за ошибками. За это отвечают функции xml_get_error_code и xml_error_string. Первая функция получает код ошибки, а вторая — по полученному коду возвращает текстовое описание ошибки. Что в результате возникновения ошибки получится — рассмотрим позже. Не менее полезная функция xml_get_current_line_number скажет нам номер текущей обрабатываемой строки в файле.

    И как всегда мы должны освободить занимаемые системой ресурсы. Для парсинга XML — это функция xml_parser_free:


    Вот, основные функции мы рассмотрели. Пора бы посмотреть их на деле. Для этого я придумал xml-файл с очень простой структурой:

    Назовем этот файл data.xml и попытаемся его распарсить с помощью следующего кода:

    startElement ( $parser , $name , $attrs ) <
    global $depth ;

    echo str_repeat ( » » , $depth * 3 ); // отступы
    echo «Element: $name
    » ; // имя элемента

    $depth ++; // увеличиваем глубину, чтобы браузер показал отступы

    foreach ( $attrs as $attr => $value ) <
    echo str_repeat ( » » , $depth * 3 ); // отступы
    // выводим имя атрибута и его значение
    echo ‘Attribute: ‘ . $attr . ‘ = ‘ . $value . ‘
    ‘ ;
    >
    >

    function endElement ( $parser , $name ) <
    global $depth ;

    $depth —; // уменьшаем глубину
    >

    $depth = 0 ;
    $file = «data.xml» ;

    xml_set_element_handler ( $xml_parser , «startElement» , «endElement» );

    if (!( $fp = fopen ( $file , «r» ))) <
    die( «could not open XML input» );
    >

    while ( $data = fgets ( $fp )) <
    if (! xml_parse ( $xml_parser , $data , feof ( $fp ))) <
    echo «
    XML Error: » ;
    echo xml_error_string ( xml_get_error_code ( $xml_parser ));
    echo » at line » . xml_get_current_line_number ( $xml_parser );
    break;
    >
    >

    В результате разработанного нами простейшего скрипта браузер вывел в свое окно следующую информацию:

    Попробуем испортить XML-файл, заменив тег

    на , а закрывающий тег оставив прежним:

    Element: ROOT
    Element: INFO
    Attribute: WHO = моя
    Element: ADDRESS
    Attribute: ULICA = моя улица!!
    Attribute: KVARTIRA = 12
    Attribute: DOM = 15
    Element: TELEPHONE

    XML Error: Mismatched tag at line 5

    Ух ты! Сообщения об ошибках работают! Причем довольно информативные.

    Эх, я забыл еще одну вещь… Мы же не вывели текст, содержащийся внутри тегов address и phone. Исправляем наш недочет — добавляем текстовый обработчик с помощью функции xml_set_character_data_handler:

    И добавляем в код саму функцию-обработчик:

    stringElement ( $parser , $str ) <
    if ( strlen ( trim ( $str )) > 0 ) <
    global $depth ;

    echo str_repeat ( » » , $depth * 3 ); // отступ
    echo ‘String: ‘ . $str . ‘
    ‘ ; // выводим строку
    >
    >
    ?>

    Посмотрим теперь на вывод:

    О! Теперь вывели все!

    Кстати, кто-нибудь заметил, что имена тегов и атрибутов все большими буквами написаны? Странно… они же в нашем xml-файле малыми буквами обозначены. Видимо где-то какие-то настройки установлены, чтобы делать uppercase…

    Ааа, нашел! Оказывается есть еще функция xml_parser_set_option:

    Таким вызовом мы отменяем вывод имен атрибутов и имен тегов большими буквами:

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

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL