base21 5

PHP и XML

XML - это сокращение от extensible Markup Language (расширяемый язык разметки). Язык XML — подмножество гораздо более сложного языка SGML (Standard Generalized Markup Language — стандартный обобщенный язык разметки), но для использования XML не требуется что-либо знать о языке SGML. Язык XML определяет синтаксис создания структурированных документов, доступных для чтения людьми и компьютерами.

Язык XML позволяет создавать независимые от приложения форматы обмена данными. Такая возможность становится предпосылкой появления в будущем все более эффективных и простых методов разработки программ для веб.

Возможно, проще всего можно понять назначение языка XML, представив себе все те области обработки данных, в которых не может применяться язык HTML. Безусловно, HTML — это также язык разметки, но документы HTML никак нельзя назвать структурированными. Дескрипторы HTML (формально называемые тегами) и атрибуты представляют собой всего лишь простые идентификационные маркеры, распознаваемые браузером.

Например, пара согласованных дескрипторов <h1> и </h1> обозначает заголовок верхнего уровня. Браузеры интерпретируют эту пару дескрипторов как указание на то, что текст данного заголовка должен быть отображен крупным, полужирным, а также, возможно, курсивным шрифтом (в зависимости от настройки). Но язык HTML не указывает, является ли текст между этими дескрипторами названием страницы, именем автора, приглашением открыть страницы сайта, уместной здесь цитатой, предложением воспользоваться специальными скидками и т.д. Таким образом, данные дескрипторы сообщают лишь о том, что некоторый текст должен быть отображен с помощью крупного шрифта.

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

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

Код XML
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://addphp.ru/</loc>
    <priority>1.0</priority>
    <lastmod>2013-05-04</lastmod>
  </url>
  <url>
    <loc>http://addphp.ru/materials/base/</loc>
    <priority>0.6</priority>
    <lastmod>2013-05-04</lastmod>
  </url>
</urlset>

Вполне очевидно, что в коде XML имеются разнообразные дескрипторы и атрибуты, а также просматривается такая же иерархическая структура, как и в коде HTML. В языке XML каждая пара дескрипторов называется элементом.

При формировании документа XML необходимо учитывать описанные ниже минимальные требования к его структуре:

  • В документе должен быть предусмотрен лишь единственный корневой элемент, который включает все другие элементы, подобно элементу <html></html> в документах HTML. Иногда корневой элемент называют также элементом документа.

  • Структура вложения элементов должна быть иерархической. Это означает, что структура документа с дескрипторами <x><y> </y></x> является допустимой, а структура <x><y> </x></y> — нет. В первом примере очевидно, что элемент <x> полностью включает элемент <y>, а во втором примере элементы <x> и <y> перекрываются. Язык XML не допускает, чтобы дескрипторы включаемого элемента выходили за пределы дескрипторов включающего элемента (т.е. перекрывались).

  • Все элементы должны иметь закрывающий дескриптор (в этом состоит отличие XML от HTML, в котором допускается применение некоторых незакрытых элементов). Задача закрытия элемента может быть решена с использованием закрывающего дескриптора (например, </lastmod>), как в языке HTML, или средства XML не требующим закрывающего дескриптора (например, <logo href="graphic.jpg"/>).

  • Элементы могут содержать другие элементы, текст и прочие данные. Если элемент включает фрагменты текста, напоминающие код XML (допустим, <hello>), но не являются таковыми, или требуется исключить синтаксический анализ какого-то символа в тексте, то этот символ должен быть обозначен символами переключения на другой режим обработки.

Кроме перечисленных выше обязательных требований, которые относятся к категории так называемых требований по обеспечению формальной правильности, стандарт XML указывает также, что документы XML должны начинаться с идентификационного объявления XML. Это объявление представляет собой инструкцию по обработке, в которой указаны тип MIME и номер версии, как в примере <?xml version="1.0" encoding="utf-8"?>. Это объявление не обязательное, но некоторые синтаксические анализаторы, не обнаружив его, выводят сообщение об ошибке. Кроме того, код XML чувствителен к регистру, а в некоторых версиях XML, таких как XHTML, требуется, чтобы имена дескрипторов и атрибутов состояли из строчных букв. В самом стандарте XML нет абсолютно никаких указаний в отношении дескрипторов с именами, состоящими из строчных букв, но всегда рекомендуется использовать дескрипторы и атрибуты, заданные в нижнем регистре, если нет весомых оснований для использования букв другого регистра.

Практическое применение языка XML

Выше были описаны основные преимущества языка XML, а в данном разделе рассматриваются основные области применения XML. Эта тема — довольно сложная. С точки зрения теории язык XML используется в трех направлениях: манипулирование данными и хранение данных; передача данных из одного программного приложения в другое; отображение страниц XML в браузере или в другом приложении с помощью директив вывода на дисплей, заданных в виде таблиц стилей.

На практике почти никто не использует язык XML для хранения данных в качестве основного средства представления данных, поскольку для представления данных повсеместно применяются реляционные структуры данных и язык SQL. Манипулирование данными с помощью XML обеспечить возможно, хотя все еще трудно (например, существует возможность редактировать документы, создавая и манипулируя узлами XML, а не внося изменения непосредственно в текст), но и в этом случае многие пользователи не находят особых преимуществ в подобном подходе. В последние несколько лет достигнуты значительные успехи в части методов представления кода XML в браузере, как правило, в форме XHTML, но реализация и этого подхода сопряжена с преодолением значительных сложностей.

Поэтому в настоящее время остается наиболее перспективным такое основное направление применения языка XML, как обмен данными между приложениями и организациями. Как оказалось, именно в этой области язык PHP может оказать самое непосредственное содействие. Например, с помощью программы C могут быть выполнены некоторые операции с данными, полученными из базы данных, затем осуществлен вывод результатов в коде XML, который может быть преобразован с помощью языка PHP в код HTML для отображения в браузере или другом приложении.

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

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

Сравнение API-интерфейсов SAX и DOM

Для обработки кода XML и документов XML чаще всего применяются три основных типа API-интерфейсов: SimpleXML, объектная модель документа (Document Object Model — DOM) и простой API-интерфейс для XML (Simple API for XML — SAX). Все три этих модуля теперь включены во все дистрибутивы PHP.

Для синтаксического анализа и модификации любого документа XML можно использовать любой из трех API-интерфейсов — DOM, SAX или SimpleXML. А для создания или дополнения документа XML исключительно с помощью интерфейса PHP (иными словами, без написания каких-либо фрагментов документа XML вручную) необходимо использовать DOM. Каждый из API-интерфейсов имеет свои преимущества и недостатки, которые описаны ниже:

SAX

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

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

DOM

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

Объекты DOM можно сохранять в контейнерах, а также выводить их в виде текста. API-интерфейс DOM языка XML обеспечивает наилучшие результаты, если доступен весь документ XML. А если код XML поступает очень медленно в виде потока или требуется обработать много разных фрагментов XML как разделы одного и того же документа, то целесообразно использовать API-интерфейс SAX. Кроме того, в расширении DOM предусматривается формирование дерева в памяти, поэтому для обработки больших документов могут потребоваться значительные ресурсы.

SimpleXML

API-интерфейс SimpleXML позволяет быстро открыть файл XML, преобразовать некоторые из обнаруженных в нем элементов в собственные типы PHP (переменные, объекты и т.д.), а затем применить к этим собственным типам необходимые операции, как и в обычной программе. API-интерфейс SimpleXML позволяет обойтись без сложностей, связанных с выполнением большого количества дополнительных вызовов, которые требуются в API-интерфейсах SAX и DOM, и ограничиться меньшим объемом памяти. Кроме того, SimpIeXML часто предоставляет самый простой способ быстрого получения доступа к данным XML.

Тем не менее SimpIeXML имеет некоторые ограничения, в частности, этот API-интерфейс иногда ведет себя непредсказуемо при обработке атрибутов и глубоко вложенных элементов.

API-интерфейс DOM

API-интерфейс DOM объектной модели документа представляет собой всесторонне развитый API-интерфейс для создания, редактирования и синтаксического анализа документов XML. Сама технология DOM разработана в соответствии с рекомендациями консорциума W3C.

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

В основе расширения DOM языка PHP лежит синтаксический анализатор gnome-libxml2 (аналогичный программе libxml2 системы Gnome), поскольку считается, что эта программа требует меньше объема памяти, чем другие.

Поскольку DOM XML — это единственный полностью объектно-ориентированный API-интерфейс в языке PHP, для его использования необходимо иметь определенное представление об объектно-ориентированном программировании. Так как количество объектов и методов в этом API-интерфейсе ограниченно, не нужно иметь особо глубокие знания объектно-ориентированного программирования, чтобы успешно применять DOM XML.

Применение DOM XML

Способы использования API-интерфейса DOM зависят от поставленных целей, но чаще всего требуется выполнить описанные ниже действия:

  1. Открыть новый документ DOM XML или прочитать его, поместив в оперативную память.

  2. Выполнить манипуляции с документом на уровне узлов.

  3. Вывести результирующий документ XML в виде строки или записать его в файл. Эта операция приводит также к освобождению памяти, используемой синтаксическим анализатором.

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

Код PHP
<?php

// Создать новый XML-документ
$doc = new DOMDocument("1.0");

// Добавить корневой элемент
$root = $doc->createElement("html");
$root = $doc->appendChild($root);

// Добавить элемент body с атрибутом style
$body = $doc->createElement("body");
$body = $root->appendChild($body);
$body->setAttribute("style", "background:#87CEEB");

// Добавить элемент p с текстом "Hello, world!"
$graff = $doc->createElement("p");
$graff = $body->appendChild($graff);
$text = $doc->createTextNode("Hello, world!");
$text = $graff->appendChild($text);

// Сохранить XML-документ
$doc->save("test_dom.xml");

?>

В результате выполнения этого кода генерируется следующий XML-файл:

Создание XML-файла с помощью DOM API

Функции DOM

В таблице ниже приведены наиболее распространенные функции DOM. Эти функции необходимо вызывать, прежде чем использовать какие-либо из прочих функций DOM XML!

Функции DOM XML верхнего уровня
Функция Назначение
domxml_open_mem() Принимает в качестве параметра строку, содержащую документ XML. Выполняет синтаксический анализ документа и создает объект Document
domxml_open_file() Принимает в качестве параметра строку, содержащую имя файла XML. Выполняет синтаксический анализ файла и создает объект Document
domxml_xmltree() Принимает в качестве параметра строку, содержащую документ XML. Создает дерево объектов PHP и возвращает объект DOM. Дерево объектов, возвращаемое этой функцией, допускает только чтение
domxml_new_doc() Создает новый, пустой документ XML в памяти. Возвращает объект Document

В таблице ниже приведены наиболее важные классы API-интерфейса DOM:

Классы DOM XML
Класс Назначение
DomDocument Инкапсулирует документ XML. Содержит корневой элемент и определение DTD, если таковое имеется
DomNode Инкапсулирует узел, или элемент. Узел может быть корневым или любым элементом в пределах корневого элемента. Узлы могут содержать другие узлы, символьные данные и атрибуты
DomAttr Инкапсулирует атрибут узла. Атрибут — это определяемая пользователем характеристика узла

В следующей таблице приведены наиболее важные методы класса DomDocument:

Методы классов DomDocument, DomNode и DomAttr
Метод Назначение
DomDocument -> createElement() Создает новый элемент, дескриптором которого является переданная строка. Этот элемент необходимо присоединить к другому элементу с помощью команды DomNode->appendChild()
DomDocument -> createTextNode() Создает новый текстовый узел (объект DomText). Этот узел необходимо присоединить к другому узлу с помощью команды DomNode->appendChild()
DomDocument -> save() Выводит документ XML из памяти в указанный файл
DomDocument -> saveXML() Выводит документ XML из памяти в строку. Необязательным параметром является объект DomNode
DomNode -> appendChild() Присоединяет узел к другому узлу
DomNode -> removeChild() Удаляет дочерний узел
DomAttr -> name() Возвращает имя атрибута
DomAttr -> value() Возвращает значение атрибута

API-интерфейс SAX

Так называемый простой API-интерфейс для XML широко применяется для синтаксического анализа документов XML. Данный API-интерфейс основан на использовании событий. Это означает, что синтаксический анализатор SAX вызывает указанные ему функции после обнаружения того, что активизировалось определенное событие в потоке событий.

История развития API-интерфейса SAX является очень интересной, особенно в сопоставлении с API-интерфейсом DOM. Прежде всего, API-интерфейс SAX не разрабатывался под эгидой какой-либо официальной организации по стандартизации, а был создан группой программистов, объединившихся вокруг списка рассылки XML-DEV, многие из которых уже реализовали свои собственные синтаксические анализаторы XML (в первую очередь на языке Java) без применения стандартного API-интерфейса.

API-интерфейс SAX действует no принципу использования множества обработчиков прерываний от событий. Эти обработчики прерываний задаются с помощью кода PHP. По мере того как синтаксический анализатор проходит по документу XML, распознаются такие фрагменты кода XML, как элементы, символьные данные и внешние сущности. Каждый случай распознавания активизируется как событие. Если синтаксическому анализатору предоставлена функция, подлежащая вызову после обнаружения какой-то конкретной разновидности событий, то синтаксический анализатор на время приостанавливает обработку такой функции после возникновения указанного события.

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

До выхода версии 5 в языке PHP использовался программный продукт expat Джеймса Кларка (James Clark) — широко применяемый инструментарий создания синтаксических анализаторов XML. Дополнительную информацию о программах expat можно найти на веб-сайте Кларка по адресу www.jclark.com/xml. Но если интерпретатор PHP откомпилирован вместе с библиотекой libxml2, то вы будете иметь возможность использовать весь свой код SAX для версии PHP4 и в версии PHP5 без каких-либо проблем.

К сожалению, термином синтаксический анализатор обозначают и программную библиотеку, такую как libxml2, и блок функций обработки XML в языке PHP. Но если речь идет о создании и вызове синтаксического анализатора, то подразумевается последняя, более конкретная трактовка. Последнее толкование подразумевается также в описаниях всех функций XML языка PHP, в которых используется термин синтаксический анализатор.

Применение API-интерфейса SAX

Способы использования API-интерфейса SAX зависят от поставленных целей, но чаще всего осуществляются описанные ниже действия:

  1. Определить, какого рода события подлежат обработке.

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

  3. Создать синтаксический анализатор с использованием функции xml_parser_create(), а затем вызвать его с помощью функции xml_parse().

  4. Освободить память, занимаемую синтаксическим анализатором, с помощью функции xml_parser_free().

Ниже приведен простой пример применения всех основных функций XML (XML-файлом, используемым в данном примере, является файл test_dom.xml, который был создан выше):

Код PHP
<?php

$file = "test_dom.xml";

// Вызывать эту функцию до начала обработки каждого элемента 
function startElement($parser, $name, $attrs) {
	echo "<b>$name =></b> ";
}

// Вызывать эту функцию после окончания обработки каждого элемента 
function endElement($parser, $name) {
	echo "\n";
}

// Вызывать эту функцию при обнаружении символьных данных 
function characterData($parser, $value) {
	echo "$value<br>";
}

// Создать экземпляр синтаксического анализатора 
$simple_parser = xml_parser_create();
xml_set_element_handler($simple_parser, "startElement", "endElement");
xml_set_character_data_handler($simple_parser, "characterData"); 

// Открыть файл XML для чтения 
if (!($fp = fopen($file, "r"))) 
{ 
	die("Невозможно открыть указанный XML-файл");
}

// Выполнить его синтаксический анализ
while ($data = fread($fp, filesize($file))) {
	if (!xml_parse($simple_parser, $data, feof($fp))) {
		die(xml_error_string(xml_get_error_code($simple_parser)));
	}
}

// Освободить память
xml_parser_free($simple_parser); 

?>
Получение дерева XML-документа с помощью SAX API

Опции настройки конфигурации SAX

Среди опций настройки синтаксического анализатора XML, применяемого в сочетании с API-интерфейсом SAX, имеются две реконфигурируемые опции. Одна из них относится к приведению к единому регистру, а другая — к выбору целевой кодировки.

Опция приведения к единому регистру сохранилась как последствие ряда решений, принятых в прошлом, поэтому в наши дни, после того как язык XML окончательно объявлен чувствительным к регистру, может оказаться недействительной. Ранее версии языков SGML и HTML были нечувствительными к регистру, и поэтому для получения единообразных результатов, подлежащих сравнению, использовалась операция приведения к единому регистру (преобразования всех символов в верхний или нижний регистр во время синтаксического анализа).

Благодаря этому браузер приобретает способность, скажем, согласовывать дескриптор <P> с дескриптором </р>. Но операция приведения к единому регистру оказалась неприемлемой из-за проблем, связанных с интернационализацией, поэтому после продолжительных дискуссий язык XML был объявлен как чувствительный к регистру. Если опция приведения к единому регистру разрешена, то все имена узлов, передаваемые обработчикам событий, преобразуются путем замены всех прописных букв строчными, поэтому, например, имя узла mynode поступает к обработчику событий в виде MYNODE. А если опция приведения к единому регистру запрещена, то открывающий дескриптор <paragraph> не согласуется с закрывающим дескриптором </PARAGRAPH>.

Использование опции приведения к единому регистру разрешено по умолчанию, что противоречит спецификации XML 1.0. Если применение этой опции не будет запрещено с помощью функции xml_parser_set_option(), то дескрипторы будут передаваться в обработчики событий после преобразования строчных букв в прописные.

Обработчики событий получают текстовые данные из синтаксического анализатора XML в одной из трех кодировок — ISO-8859-1, US-ASCII или UTF-8. По умолчанию применяется кодировка ISO-8859-1. Кодировка текста, передаваемого обработчикам событий, называется целевой кодировкой. По умолчанию целевая кодировка совпадает с кодировкой, используемой в исходном документе, которая называется исходной кодировкой. Если текст должен обрабатываться в кодировке, отличной от той, в которой он хранится, то можно изменить значение опции целевой кодировки.

Выборка значений опций кодировки и задание этих значений осуществляется с помощью функций xml_parser_get_option() и xml_parser_set_option(). Для управления операцией приведения к единому регистру используется константа XML_OPTION_CASE_FOLDING, а целевая кодировка задается с помощью константы XML_OPTlON_TARGET_ENCODING.

В следующем примере показано, как создать синтаксический анализатор XML, который считывает данные в коде ASCII, отменить опцию приведения к единому регистру и вывести результаты в кодировке UTF-8:

Код PHP
$simple_parser = xml_parser_create('US-ASCII');

$case_folding = xml_parser_get_option($simple_parser, XML_OPTION_CASE_FOLDING);
echo $case_folding.'<br>';

$change_folding = xml_parser_set_option($simple_parser, XML_OPTION_CASE_FOLDING, 0);

$target_encoding = xml_parser_get_option($simple_parser, XML_OPTION_TARGET_ENCODING); 
echo $target_encoding.'<br>';

$change_encod±ng = xml_parser_set_option($simple_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');

Функции API-интерфейса SAX

В таблице ниже приведен список наиболее важных функций SAX и описано их назначение:

Функции API-интерфейса SAX языка XML
Функция Назначение
xml_parser_create ([encoding]) Создает новый экземпляр синтаксического анализатора XML. В программе в любое время можно определить несколько разных синтаксических анализаторов. Возвращаемым значением является экземпляр синтаксического анализатора XML, в случае неудачного завершения функция возвращает значение false. Принимает один необязательный параметр — идентификатор кодировки символов (такой как UTF-8). Если кодировка не задана, по умолчанию применяется ISO-8859-1
xml_parse (parser, data, [final]) Вызывает на выполнение синтаксический анализатор XML. Ее параметрами являются синтаксический анализатор, созданный с использованием функции xml_parser_create(), строка, содержащая документ XML, и необязательный флажок завершения. Флажок завершения final позволяет указать, что текущий фрагмент данных представляет собой последний фрагмент, предназначенный для обработки этим синтаксическим анализатором
xml_get_error_code (parser) Если в процессе работы синтаксического анализатора возникает проблема, то выполняемый синтаксический анализ оканчивается неудачей. Вызов этой функции на выполнение позволяет определить код ошибки
xml_error_string (errorcode) После получения кода ошибки, возвращенного функцией xml_get_error_code(), возвращает строку, содержащую описание ошибки, которое может применяться для записи в лог
xml_set_element_handler (parser, start_element_handler, end_element_handler) Фактически устанавливает два обработчика, которые представляют собой просто функции. Первым из них является обработчик начального дескриптора элемента, имеющий доступ к имени элемента и к ассоциативному массиву атрибутов элемента, а вторым — обработчик конечного дескриптора элемента, который обеспечивает полный синтаксический анализ элемента
xml_set_character_data_handler (parser, cd_handler) Устанавливает функцию обработчика, которая вызывается каждый раз при обнаружении символьных данных. Функция обработчика принимает в качестве параметра строку, содержащую символьные данные
xml_parser_free (parser) Освобождает память, связанную с синтаксическим анализатором, который создан функцией xml_parser_create()
xml_set_default_handler (parser, handler) Устанавливает обработчик, применяемый по умолчанию. Если для некоторого события не указан ни один обработчик, то вызывается обработчик, применяемый по умолчанию, если он задан. Принимает в качестве параметра указатель на объект синтаксического анализатора и функцию-обработчик

API-интерфейс SimpleXML

API-интерфейс SimpleXML впервые появился в версии PHP 5 и рассматривается как средство отображения объектов. Указанный API-интерфейс не опирается на стандарты веб и направлен в основном на достижение простоты эксплуатации и сокращения потребности в памяти, пусть даже за счет определенной потери гибкости. Если требуется просто прочитать некоторые данные из документа XML и записать вместо них какие-то другие данные, то при решении этой задачи с помощью API-интерфейса SimpleXML потребуется наименьшее количество строк кода по сравнению со всеми другими возможными подходами.

В основе API-интерфейса SimpleXML лежит следующая идея: в программу передается сразу весь документ XML, после чего осуществляется синтаксический анализ документа и все результаты обработки документа сохраняются в памяти. Но документ хранится в памяти не в виде объекта DOM (с которым требуется выполнить дополнительные манипуляции, прежде чем использовать его содержимое), а в виде отдельных элементов, хранящихся в форме собственных переменных PHP, поэтому непосредственно доступных для применения. Безусловно, при решении многих задач, в которых используется API-интерфейс DOM, фактически не требуется проходить по всем дочерним и родительским узлам документа, а скорее необходимо применить одну и ту же операцию к группе вполне определенных узлов. Это означает, что SimpleXML в конечном итоге представляет собой характерный для языка PHP компромисс между подходами на основе SAX и DOM.

Использование API-интерфейса SimpleXML

При использовании API-интерфейса SimpleXML вначале с помощью функции simplexml_load_string() или simplexml_load_file() считывается представленный в какой-то форме (в виде строки или файла) код XML и присваивается переменной. Тем самым создается локальный объект, непосредственно доступный с помощью ссылки. В примере ниже показано, как можно применять API-интерфейс SimpleXML для получения значений переменных из файла XML с помощью всего лишь нескольких строк кода:

Код PHP
if (file_exists('test_dom.xml')) {
    $xml = simplexml_load_file('test_dom.xml');
    print_r($xml);
	
	echo $xml->body;
	echo $xml->p;
	// ...
}

Функции API-интерфейса SimpleXML

В следующей таблице приведен список наиболее важных функций SimpleXML и указано их назначение:

Общие сведения о функциях SimpleXML
Функция Назначение
simplexml_load_file (file) Импортирует и выполняет синтаксический анализ файла
simplexml_load_string (string) Импортирует и выполняет синтаксический анализ строки
simplexml_import_dom (DomDocument) Позволяет преобразовать объект DomDocument в объект SimpleXML, а затем обработать его точно так же, как импортированный файл или импортированную строку XML
PHP и JavaScript
Отправка электронной почты

Комментарии (0)

Результаты поиска по запросу

Система Orphus