PHP Использование XML Paser Functions при работе с шаблонами 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 сейчас значения не имеет (хотя там вроде и так все понятно). Единственное, что только здесь может обозначать цветная фотка или нет. Это здесь только для примера тега, у которого нет закрывающегося.

А теперь напишем скрипт, который показывал бы структуру 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-документа на 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.

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

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

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

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

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

  • 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 Русаков Михаил Юрьевич. Все права защищены.

    Часть 1. Работа с XML в PHP за 15 минут

    PHP5 значительно упрощает работу с XML в PHP

    Серия контента:

    Этот контент является частью # из серии # статей: XML для PHP-разработчиков

    Этот контент является частью серии: XML для PHP-разработчиков

    Следите за выходом новых статей этой серии.

    Другие статьи этой серии

    Значение XML в современной среде разработки приложений трудно переоценить. Тем, кто никогда не работал с XML в РНР или еще не перешел на РНР5, это краткое руководство поможет освоить новую функциональность РНР5, связанную с XML, и оценить, насколько простой может быть работа с XML. Эта первая из трех статей посвящена знакомству с API и демонстрирует, что SimpleXML в сочетании с DOM служит идеальным инструментом для разработчиков, имеющих дело с простыми, предсказуемыми и относительно компактными XML-документами. Именно такими документами оперируют, например, Ajax-приложения при передаче информации о заполнении формы, в такие же документы оформляются ответы API Web-сервисов, таких как weather.com.

    Основы XML

    Краткое введение в основы XML позволит читателю понять важность этого языка для РНР-разработчика и научиться создавать простые XML-документы.

    Сведения об XML

    Язык Extensible Markup Language (XML) можно назвать и языком разметки, и форматом хранения текстовых данных. Это подмножество языка Standard Generalized Markup Language (SGML); он предоставляет текстовые средства для описания древовидных структур и их применения к информации. XML служит основой для целого ряда языков и форматов, таких как Really Simple Syndication (RSS), Mozilla XML User Interface Language (XUL), Macromedia Maximum eXperience Markup Language (MXML), Microsoft eXtensible Application Markup Language (XAML) и open source-язык Java XML UI Markup Language (XAMJ).

    Структура XML

    Базовым блоком данных в XML является элемент. Элементы выделяются начальным тегом, таким как , и конечным тегом, таким как . Каждому начальному тегу должен соответствовать конечный тег. Если для какого-то начального тега отсутствует конечный тег, XML-документ оформлен неправильно, и синтаксический анализатор (парсер) не сможет проанализировать его надлежащим образом. Названия тегов обычно отражают тип элемента. Можно ожидать, что элемент book содержит название книги, например, «Большой американский роман» (см. листинг 1). Текст, содержащийся между тегами, включая пробелы, называется символьными данными.

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

    Имена XML-элементов и атрибутов могут состоять из латинских букв верхнего (A-Z ) и нижнего (a-z) регистров, цифр (0-9), некоторых специальных и неанглийских символов, а также трех знаков пунктуации: дефиса, знака подчеркивания и точки. Другие символы в именах не допускаются.

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

    Каждый документ XML содержит один и только один корневой элемент. Корневой элемент — это единственный элемент XML-документа, для которого нет родительского элемента. В приведенном выше примере корневым является элемент . Большинство XML-документов содержат родительские и дочерние элементы. Элемент имеет один дочерний элемент . У элемента четыре дочерних элемента: , ,

    и . У элемента три дочерних элемента, каждый из которых является элементом . У каждого элемента по два дочерних элемента, и .

    Кроме вложенных элементов, что создает отношения родительский-дочерний, XML-элементы могут иметь атрибуты. Это пары имя-значение, присоединенные к начальному тегу элемента. Имена отделяются от значений знаком равенства, =. Значения заключаются в одинарные или двойные кавычки. В листинге 1 элемент имеет два атрибута: «bestseller» и «bookclubs». XML-разработчики практикуют разные подходы к использованию атрибутов. Большую часть информации, содержащейся в атрибуте, можно поместить в дочерний элемент. Некоторые разработчики настаивают на том, чтобы информация атрибутов состояла не из данных, а из метаданных, то есть сведений о данных. Сами данные должны содержаться в элементах. На самом деле решение о том, использовать ли атрибуты, зависит от природы данных и от того, как они извлекаются из XML.

    Достоинства XML

    Одно из достоинств XML состоит в его относительной простоте. XML-документ можно составить в простом текстовом редакторе или текстовом процессоре, не прибегая к специальным инструментам или ПО. Базовый синтаксис XML состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержание. Обычно элемент начинается открывающим тегом и заканчивается соответствующим закрывающим тегом . XML чувствителен к регистру и не игнорирует пробелы и табуляции. Он очень похож на HTML, но, в отличие от HTML, позволяет присваивать тегам имена для лучшего описания свох данных. К числу преимуществ XML относится самодокументирование, читабельный для людей и компьютеров формат, поддержка Unicode, что позволяет создавать документы на разных языках, и простые требования к синтаксису и синтаксическому анализу. К сожалению, в РНР5 поддержка UTF-8 сопряжена с проблемами; это один из тех недостатков, которые привели к разработке РНР6.

    Недостатки XML

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

    Правильно построенный XML

    XML-документ считается построенным правильно, если в нем соблюдены правила XML-синтаксиса. Неправильно построенный формат в техническом смысле не является XML-документом. Например, такой HTML-тег, как
    , в XML неприемлем; соответствующий правильный тег выглядит как
    . Корневой элемент можно представить себе как бесконечный шкаф с документами. У вас всего один шкаф, но почти нет ограничений на тип и количество его содержимого. В вашем шкафу помещается бесконечное количество ящиков и папок для документов.

    Основы PHP

    Большинство читателей этой статьи уже работают с РНР, но, возможно, незнакомы с его историей и эволюцией.

    О PHP

    Hypertext Preprocessor (PHP) — это не зависящий от платформы язык сценариев, используемый для создания динамических Web-страниц и серверных приложений. Он начинался как Personal Home Page/Form Interpreter (PHP/FI) и обрел новую жизнь в руках Сураски (Suraski) и Гутманса (Gutmans), которые в июне 1998 года выпустили РНР3. Их компания Zend Technologies до сих пор управляет разработкой PHP.

    В июле 2004 года вышел PHP5 с Zend Engine II и многими новыми функциями, такими как:

    • Поддержка объектно-ориентированного программирования
    • Улучшенная поддержка MySQL
    • Улучшенная поддержка XML

    PHP5 и XML

    Поддержка XML присутствовала в РНР с самых ранних версий, но в РНР5 она существенно улучшена. Поддержка XML в РНР4 была ограниченной, в частности, предлагался только включенный по умолчанию парсер на базе SAX, а поддержка DOM не соответствовала стандарту W3C. В РНР5 разработчики PHP XML, можно сказать, изобрели колесо, обеспечив соответствие общепринятым стандартам.

    Новое в поддержке XML в версии PHP5

    PHP5 содержит полностью переписанные и новые расширения, включая парсер SAX, DOM, SimpleXML, XMLReader, XMLWriter и процессор XSLT. Теперь все эти расширения основаны на libxml2.

    Наряду с улучшенной по сравнению с PHP4 поддержкой SAX, в РНР5 реализована поддержка DOM в соответствии со стандартом W3C, а также расширение SimpleXML. По умолчанию включены и SAX, и DOM, и SimpleXML. Тем, кто знаком с DOM по другим языкам, станет проще реализовать аналогичную функциональность в РНР

    Мастер Йода рекомендует:  Классы и объекты в РНР со Штирлицом и Мюллером PHP

    Чтение, обработка и написание XML в PHP5

    SimpleXML, при необходимости в сочетании с DOM, — идеальный выбор для чтения, обработки и составления в РНР5 простых, предсказуемых и относительно компактных документов.

    Краткий обзор предпочтительных API

    Из множества API, присутствующих в РНР5, DOM — самый знакомый, а на SimpleXML проще всего программировать. В типичных ситуациях, таких как те, что мы здесь рассматриваем, они наиболее эффективны.

    Расширение DOM

    Document Object Model (DOM) — это принятый W3C стандартный набор объектов для документов HTML и XML, стандартная модель сочетания этих объектов и стандартный интерфейс для доступа к ним и манипуляций с ними. Многие поставщики поддерживают DOM в качестве интерфейса к своим специальным структурам данных и API, благодаря чему модель DOM знакома массе разработчиков. DOM легко освоить и применять, так как его структура в памяти напоминает исходный документ XML. Чтобы передать информацию приложению, DOM создает дерево объектов, которое в точности повторяет дерево элементов файла XML, так что каждый элемент XML служит узлом этого дерева. DOM — это парсер, основанный на древовидной структуре. Поскольку DOM строит дерево всего документа, он потребляет много ресурсов памяти и времени процессора. Поэтому анализ очень крупных документов посредством DOM непрактичен из-за проблем производительности. В контексте данной статьи расширение DOM используется главным образом из-за его способности импортировать формат SimpleXML и выводить XML в формате DOM, или, наоборот, для использования в качестве строковых данных или XML-файла.

    SimpleXML

    Расширение SimpleXML – это предпочтительный инструмент для синтаксического анализа XML. Для его работы требуется РНР5. Оно взаимодействует с DOM при составлении XML-файлов и имеет встроенную поддержку XPath. SimpleXML лучше всего работает с несложными данными типа записей, такими как XML, передаваемый в виде документа или строки из другой части того же приложения. Если XML-документ не слишком сложный, не слишком глубокий и не содержит смешанного контента, для SimpleXML кодировать проще, чем для DOM, как и предполагает название. К тому же он надежнее при работе с известной структурой документа.

    Простые примеры

    Ниже приведены простые примеры работы с DOM и SimpleXML на компактных XML-файлах.

    DOM в действии

    Модель DOM, реализованная в PHP5, — это та же спецификация W3C DOM, с которой вы имеете дело в браузере и с которой работаете посредством JavaScript. Используются те же методы, так что способы кодирования покажутся вам знакомыми. Листинг 2 иллюстрирует использование DOM для создания XML-строки и XML-документа, отформатированных в целях читабельности.

    Листинг 2. Применение DOM

    Это приводит к созданию выходного файла, приведенного в листинге 3.

    Листинг 3. Выходной файл

    Листинг 4 импортирует объект SimpleXMLElement в объект DOMElement , иллюстрируя взаимодействие DOM и SimpleXML.

    Листинг 4. Взаимодействие, часть 1 — DOM импортирует SimpleXML

    Функция из листинга 5 берет узел документа DOM и превращает его в узел SimpleXML. Затем этот новый объект можно использовать в качестве «родного» элемента SimpleXML. В случае любой ошибки возвращается значение FALSE.

    Листинг 5. Взаимодействие, часть 2 — SimpleXML импортирует DOM

    SimpleXML в действии

    Расширение SimpleXML – это предпочтительный инструмент для синтаксического анализа XML. Оно взаимодействует с DOM при составлении XML-файлов и имеет встроенную поддержку XPath. Для SimpleXML проще писать код, чем для DOM, как и предполагает его название.

    Для тех, кто не знаком с РНР, листинг 6 форматирует тестовый XML-файл как include-файл в целях читабельности.

    Листинг 6. В следующих примерах тестовый XML-файл отформатирован как include-файл РНР с именем example.php.

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

    Листинг 7. Извлечение узла – как легко его получить?

    С другой стороны, может понадобиться извлечь многострочный адрес. Когда у одного родительского элемента несколько экземпляров дочернего элемента, применяется обычная методика итерирования. Эта функциональность показана в листинге 8.

    Листинг 8. Извлечение нескольких экземпляров элемента

    Кроме чтения имен элементов и их значений, SimpleXML может также обращаться к атрибутам элемента. В листинге 9 производится обращение к атрибутам элемента; это делается точно так же, как обращение к элементам массива.

    Листинг 9. Демонстрация обращения SimpleXML к атрибутам элемента

    Чтобы сравнить элемент или атрибут со строкой или передать его функции, которой требуется строка, нужно преобразовать его в строку при помощи оператора (string). Иначе, по умолчанию, РНР рассматривает элемент как объект (листинг 10).

    Листинг 10. Преобразуй в строку, или проиграешь

    Данные в SimpleXML не обязаны быть неизменными. Листинг 11 выводит новый XML-документ, точную копию исходного, за исключением того, что в новом имя Cliff изменено на Big Cliff.

    Листинг 11. Изменение текстового узла с помощью SimpleXML

    Начиная с версии PHP 5.1.3 SimpleXML дополнен возможностью легко добавлять дочерние элементы и атрибуты. Листинг 12 выводит XML-документ, основанный на исходном, но с добавленным новым персонажем и описанием.

    Листинг 12. Добавление дочерних и текстовых узлов с помощью SimpleXML

    Заключение

    Эта первая статья серии из трех частей посвящена знакомству с API и демонстрирует, что SimpleXML, при необходимости в сочетании с DOM, служит идеальным инструментом для разработчиков, имеющих дело с простыми, предсказуемыми и относительно компактными XML-документами. Версия PHP5 значительно расширила возможности программистов в части работы с XML в РНР. Во второй части мы рассмотрим более сложные методы синтаксического анализа XML.

    Ресурсы для скачивания

    Похожие темы

    • Оригинал статьи (EN). (EN)
    • XML для PHP-разработчиков, часть 2: дополнительные методы синтаксического анализа XML (Клифф Морган, developerWorks, март 2007 г.): во второй части этой серии статей из трех частей мы рассмотрим методы синтаксического анализа XML, используемые в РНР5, и научимся решать, какой метод лучше подходит для данного приложения.(EN)
    • XML для PHP-разработчиков, часть 3: дополнительные методы чтения, организации и составления XML-документов (Клифф Морган, developerWorks, март 2007 г.): в заключительной части серии из трех статей об XML для РНР-разработчиков рассказывается о методах чтения, обработки и составления XML в РНР5.(EN)
    • Reading and writing the XML DOM in PHP (Jack Herrington, developerWorks, декабрь 2005 г.): Три метода чтения XML: библиотека DOM, синтаксический анализатор SAX и регулярные выражения. Также рассказывается, как писать XML с применением текстовых шаблонов DOM и PHP (EN).

    • SimpleXML Processing with PHP (Elliotte Rusty Harold, developerWorks, октябрь 2006 г.): Расширение SimpleXML позволяет PHP-страницам обращаться к XML с запросами, вести в них поиск, модифицировать и повторно публиковать его (EN).
    • A PHP5 migration gu >

    Комментарии

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

    PHP XML Expat парсер

    Встроенный парсер XML Expat позволяет обрабатывать XML-документы в PHP.

    Парсер XML Expat

    Парсер Expat — это синтаксический анализатор, основанный на событиях.

    Посмотрите на следующую дробную часть XML:

    Синтаксический анализатор на основе событий сообщает XML выше как серию из трех событий:

    • Начальный элемент: от
    • Начало раздела CDATA, значение: Джани
    • Закрыть элемент: от

    XML Expat функции синтаксического анализатора являются частью ядра PHP. Для использования этих функций не требуется установка.

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

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

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

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

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

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

    ZIP Service, Москва, можно удалённо, от 100 000 ₽

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

    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(), мы можем получить результат выполнения данного запроса в виде привычного ассоциативного массива или объекта.

    Мастер Йода рекомендует:  Голосование на PHP своими руками PHP

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

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

    Вывод

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

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

    Что-то ещё?

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

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

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

    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:

    php parse xml string [duplicate]

    I have a string with XML data in it. How do I parse it in PHP?

    marked as duplicate by BoltClock ♦ Feb 13 ’12 at 18:01

    This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

    3 Answers 3

    Try with simple XML, here’s an example:

    For those situations where SimpleXML is not available, I use this function originally posted in a comment on php.net. It works great 99% of the time.

    If you’re familiar with the Zend Framework, pass your XML to Zend_Config_Xml

    given xml like this

    You can access it thusly:

    Zend Config XML uses simplexml and builds on this to give a nice interface, that makes it really easy to get to the xml node you’re looking for.

    There’s loads more in the ZF Manual, including how to access attributes, and some other really useful features.

    Zend Config is one of the easiest to use parts of ZF, and (I think) it’s a standalone component, you can use just Zend Config and no other part of ZF

    Как сделать 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 – при нахождении.

    Сами же функции 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 для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

    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. Любые предложения о том, как я могу это сделать?

    Решение

    Другой вариант — расширение SimpleXML (я полагаю, оно входит в стандартную комплектацию большинства установок php.)

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

    Другие решения

    Преобразование строки XML ( $buffer ) в упрощенный массив, игнорирующий атрибуты и группирующий дочерние элементы с одинаковыми именами:

    Если вы также хотите иметь атрибуты, они доступны через JSON-кодирование / декодирование SimpleXMLElement. Часто это самое простое и быстрое решение:

    Обратите внимание, что все эти методы работают только в пространстве имен документа XML.

    Удивлен никто не упомянул xml_parse_into_struct :

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

    Мое решение (и я хотел бы отдать должное здесь, потому что я уверен, что я кое-что адаптировал):

    // Преобразование XML в массив и SOAP XML в массив

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