Комплексная обработка данных
Данная группа функций позволяет работать с данными в формате WDDX (http://www.wddx.org/). WDDX (Web Distributed Data Exchange) — это технология для «Распределенного обмена данными в web». Этот формат (производный от XML) предназначен для переноса данных из одной системы в другую (например, обмена данными между ASP, Perl, ColdFusion и PHP). Он позволяет сохранять не только значения, но и типы, и структуру сложных данных. Поэтому данные WDDX, сериализированные в одной системе, могут использоваться в другой. Тип данных определяется автоматически и приводится к одному из следующих:
В отличие от стандартных средств сериализации РНР данные функции используют формат, поддерживаемый большинством программных сред. <?php $pi = 3.1415926. Пример выведет: <wddxPacket version='1.0'><header comnent='Комментарий
пакета'/> wddx_serialize_value Занесение одного значения в пакет WDDX string wddx_serialize_value (mixed var [, string comment]) Создает пакет WDDX из значения одной переменной var, добавляя в заголовок пакета комментарий comment, и возвращает полученный пакет. <?php print wddx_senalize_valueC"WDDX Пример выведет: <wddxPacket version='1.0'><header comment''PHP
packet'/> wddx_serialize_vars Создание пакета WDDX из нескольких значений string wddx_serialize_vars (mixed varjiame [. mixed ...]) <?php $a = 1; $b - 5.5; $c = arrayC'blue". "orange",
"violet"): Пример выведет: <wddxPacket version= '1.0'><header/><data><st.ruct>
wddx_packet_start Начало нового пакета WDDX int wddx_packet_start ([string comment]) Используется для начального создания пакета WDDX с автоинкрементным добавлением переменных. Данные затем добавляются функцией wddx_add_vars(), после чего пакет должен быть завершен с помощью wddx_packet_end(). wddx_packet_end Завершение пакета WDDX string wddx_packet_end (int packetjid) Возвращает содержимое пакета. wddx_add_vars Добавление следующей переменной в пакет WDDX wddx_add_vars (int packet_id, mixed name_var [, mixed ...]) Используется для последовательного добавления данных в пакет packet_id, созданный функцией wddx_packet_start(). wddx_deserialize Распаковка пакета WDDX mixed wddx_deseria1ize (string packet) Возвращает данные такого типа, которые были сериализированы. Функции доступны при компиляции с параметром —with-dom=[DIR] при использовании библиотеки GNOME xml (не ниже libxml-2.0.0). Модуль определяет следующие константы (типы элементов XML):
Модуль использует следующие классы для работы с интерфейсом DOM документов XML: DomDocument, DomNode, Dtd, DomAttribute, Dom-Namespace, XpathContext, XpathObject. Рекомендуется использовать объектный интерфейс, но возможно использование и функции с префиксом domxml_, как аналога методов DOM объектов. Класс DomDocument:
<?php $doc - new_xmldoc("l 0"); // DomDocument
Сценарий выводит следующее: <?xml version="l 0"?> new_xmldoc Создание нового документа DOM XML object new_xmldoc (string version) Возвращает объект класса DomDocument. Синоним функции domxml_new_xmldoc(). xmldoc Создание DOM-объекта из документа XML object xmldoc (string strXML) Интерпретирует строку, содержащую документ XML, и возвращает объект класса DomDocument. xmldocfile Создание DOM-объекта из файла XML object xmldocfile (string XMLfilename) Интерпретирует файл, содержащий документ XML, и возвращает объект класса DomDocument. xmltree Создание дерева объектов PHP из документа XML object xmltree (string strXML) $sXML='<?xml version="l 0"?> Будет выведено следующее: object(0om0ocument)(5) { Интерфейс DOM domxml_root Получение корневого элемента документа XML object domxml_root (resource DomDocument) Возвращает объект класса DomNode. if($dom = xmldoc($xmlstr)) $root = $dom->root(): domxml_add_root Создание корневого элемента DOM XML resource domxml_add_root (resource DomDocument. string name) Возвращает объект класса DomNode, созданный внутри объекта DomDocument. domxml_dumpmem Создание XML документа из объекта DOM string domxml_dumpmem (resource DomDocument) Возвращает текстовое представление документа. domxml_children Получение массива вложенных объектов раздела array domxml_crri1dren (object node) Возвращает массив дочерних объектов объекта класса DomNode. $doc = new_xmldoc("1.0"): // DomDocument Пример выводит следующее: <?xml version="l 0"?> <ML> domxml_new_child Создание секции тега resource domxml_new_chiId (string name, string content) Возвращает объект класса DomNode, созданный внутри объекта Oom-Node. domxml_ attributes Получение атрибутов узла array domxml_attributes (resource node) Возвращает объект класса DomDocuraent. $doc = new_xmldoc("1.0"): Пример выведет следующее: <?xml version="1.0"?> <ML><Hl>1212</Hl> domxml_getattr Получение атрибута узла object domxml_getattr (resource node, string name) Возвращает значение атрибута узла. В документации функция почему-то значится под именем domxml_get_attribute(). См. пример выше. domxml_set_attribute Установка атрибута узла object domxml_set_attribute (resource node, string name, string value) См. пример выше. Имена атрибутов учитывают регистр символов. XML (extensible Markup Language) — формат обмена структурированными данными в пространстве web; стандарт, определенный Консорциумом World Wide Web (W3C). Информацию о XML и связанных технологиях можно получить по адресу http://www.w3.org/XML/. Для понимания материала главы необходимо разбираться в синтаксисе XML Для работы с документами XML используются два способа.
Первый способ рассмотрен в предыдущей главе. Функции, описанные в данной главе, реализуют второй способ обработки. Событийная модель обработки (интерпретации) подразумевает следующую схему функционирования программы.
Заметьте, что интерпретатор предназначен для обработки документа, но не для его проверки; документ должен соответствовать грамматике XML (и правилам DTD). В РНР интерпретатор XML использует библиотеку expat (ее также использует Apache-1.3.9 и последующие версии), см.: http://www. jclark.com/xml/. Скомпилировать РНР с поддержкой expat можно, используя параметр --with-xml. Для документов поддерживаются кодировки US-ASCII, ISO-8859-1 (по умолчанию), UTF-8 (UTF-16 не поддерживается). Разделяют исходную и целевую кодировки. Исходная кодировка — это набор символов документа (ее можно изменять в процессе интерпретации). (Внутри РНР символы всегда хранятся в кодировке UTF-8, позволяется использовать символы размером до 21 бита.) В функции-обработчики данные передаются в целевой кодировке (для всех типов данных). При нахождении в документе-символа, не соответствующего исходной кодировке, выдается ошибка; а если символ не может быть представлен в целевой кодировке, то он заменяется на знак вопроса. Интерпретация (по умолчанию) не учитывает регистр имен тегов, то есть в функции обработки символы передаются преобразованными к верхнему регистру. Для отключения этого используйте: xml__parser_set_option($xml_parser. XML_OPTION_CASE_FOLDING. 0); Для интерпретатора можно определить следующие виды функций-обработчиков:
Коды ошибок Модулем интерпретатора XML определяются следующие константы кодов ошибок (возвращаемые функцией xml_parse()):
Примеры Следующие примеры демонстрируют возможности интерпретации документов XML. Распечатка структуры XML документа Сценарий выводит структуру на основе поиска открывающих и закрывающих тегов, используя в качестве форматирования отступы. Sfile = "data.xml": Sdeptti = аггау() Преобразование тегов XML в HTML $file = "data xml '. $jndp_array = arrayt Обработка специальных конструкций XML Пример демонстрирует обработку подключенных внешних файлов и инструкций обработки. Использует при выводе разметку HTML. $file = "xmltest.xml"; function trustedFile(Sflle)
{ Содержимое файла xmltest.xml: <?xml version='1.0">> Подключаемый файл xmltest2.xml: <?xml version="1.0"?> <!DOCTYPE foo
[ xml_parser_create Инициализация интерпретатора XML int xml_parser_create ([string encoding]) Необязательным аргументом можно указать кодировку, котор дует использовать: ISO-8859-1 (по умолчанию), US-ASCII, U Возвращает дескриптор созданного интерпретатора (исполы последующими функциями) или FALSE — при ошибке. xml_set_object Разрешение использования интерпретатора XML внутри объекта void xml_set_object (int parser, object Subject) Функция позволяет использовать в качестве всех функций oi чиков методы объекта object. <?php class xml { var Sparser. При запуске пример выведет: ** Tag open: stnng(l) "A" array(l) { f"IO"]=>
stnng(2) "99"} xml_set element_handler Назначение обработчиков открывающего и закрывающего тега int xml_set_element_hand1er (int parser, string startElementHandler, string endElementHandler) В аргументах startElementHandler и endElementHandler указываются имена пользовательских функций, вызываемых во время интерпретации (при вызове xml_parse()), когда интерпретатор встречает открывающие и закрывающие теги. Функции должны принимать следующие аргументы:
Аргумент name содержит имя тега, attribs — ассоциативный массив, содержащий атрибуты тега (если они имеются). xml_set_character_data_handler Назначение обработчика данных int xml_set_character_data_handler (int parser, string handler) Устанавливает пользовательскую функцию с именем handler как обработчик данных документа. Данными считается все то, что находится между тегами, включая пробелы. Эта функция будет вызываться во время интерпретации (при вызове xml_parse()). Она должна соответствовать прототипу: handler (int parser, string data). В аргументе data функция получает текущий блок данных. xml_set_processing_instruction_handler Назначение обработчика инструкций обработки int xml_set_processing_instruction_handler (int parser, string handler) Инструкции обработки имеют следующий формат: <?target data . ?> Используя этот формат, можно вставлять в XML документы РНР-кода, но последовательность, обозначающая конечный тег (?>), не должна встречаться в середине кода, иначе оставшаяся часть кода будет рассматриваться интерпретатором как обычные данные. Функция, устанавливаемая в качестве обработчика, должна соответствовать следующему прототипу: handler (int parser, string target, string data) В аргументе target функция получает маркер, определяющий тип кода (это может быть не только «php», но и другой, кроме зарезервированного типа «xml»). В аргументе data передается текст всего кода, который содержится внутри тега. xml_set_default_handler Установка обработчика по умолчанию int xml_set_default_handler (int parser, string handler) Устанавливаемым обработчиком будут обрабатываться все данные, которые не могут быть обработаны иным зарегистрированным обработчиком. Функция обработчика должна соответствовать следующему прототипу: handler (int parser, string data). В аргументе data функция получает блок данных для обработки. xml_set_unparsed_entity_decl_handler Установка обработчика необрабатываемых данных int xml_set_unparsed_entity_decl_handler (int parser, string handler) Данные такого типа (NDATA) определяются спецификацией XML 1.0 (раздел 4.2.2) и имеют подобный следующему формат: <!ENTITY name {publicld | systemld} NDATA notationName> Функция обработчика должна соответствовать следующему прототипу: handler (int parser, string entityNarae, string base, string systemld, string publicld, string notationName). В аргументе entityName функция получает тип тега, в base в настоящее время всегда содержится пустая строка. В аргументах systemld и publicld содержатся соответственно системный и публичный внешние идентификаторы. Аргумент notationName содержит имя нотации (см. функцию xml_set_notation_decl_handler()). xml_set notation decl_handler Установка обработчика объявлений нотаций int xml_set_notation_decl_handler (int parser, string handler) Нотации (являющиеся частью документов DTD) описаны в спецификации XML 1.0 (раздел 4.7) и имеют следующий формат: <!NOTATION na'ie [systemlcl \ publ,cld}> Функция обработчика должна соответствовать следующему прототипу: handler (int parser, string notationName, string base, string systemld, string publicld) В аргументе notationName функция получает имя нотации, в base в настоящее время всегда содержится пустая строка. В аргументах systemld и publicld содержатся соответственно системный и публичный внешние идентификаторы. xml_set_external_entity_ref_handler Установка обработчика внешних ссылок int xml_set_external_entity_ref_handler (int parser, string handler) Функция обработчика нотаций, содержащих внешние ссылки, должна возвращать целочисленное значение и соответствовать следующему прототипу: int handler (int parser, string openEntityNames, string base, string systemld, string publicld). Если обработчик возвращает значение FALSE (или не возвращает никакого), интерпретатор XML прекращает интерпретацию и функция xml_get_error_code() возвращает значение XML_ERROR_EXTERNAL_ENTITY_ HANDLING. В аргументе openEntityNames функция получает список имен, открываемых для рекурсивной интерпретации (в виде строки, где разделителями являются пробелы), в base в настоящее время всегда содержится пустая строка. В аргументах systemld и publicld содержатся соответственно системный и публичный внешние идентификаторы. xml_parse Начало интерпретации документа XML int xml_parse (int parser, string data [, int isFinal]) Функция позволяет обрабатывать документ XML по частям (многократно вызывая данную функцию и передавая каждый блок данных в аргументе data), тогда при обработке последней части документа в аргументе ispinal следует передать значение TRUE. До начала интерпретации следует инициализировать интерпретатор parser и установить все функции-обработчики, которые будет вызывать данная функция. Функция возвращает значение TRUE, если интерпретация блока документа прошла успешно. В случае ошибки возвращается значение FALSE, и затем может быть получена информация об ошибке с помощью функций xml_get_error_code(), xml_error_string(), xml _get_current_line_number (), xml _get_current_col umnjiumber (), xml _get_ current_ byte_index(). xml_get_error_code Получение кода ошибки интерпретатора XML int xml_get_error_code (int parser) Перечисление возвращаемых кодов ошибок (констант) см. в начале главы. xml_error_string Получение описания ошибки по ее коду string xml_error_string (int code) Функция позволяет получить в строке описание кода ошибки (возвращаемое функцией xml_get_error_code()). Если код недействителен, возвращается FALSE. xml_get_current_line_number Получение номера текущей интерпретируемой строки документа int xml_get_current_line_number (int parser) xml_get_current_column_number Получение номера обрабатываемого байта в текущей интерпретируемой строке документа int xml_get_current_column_number (int parser) xml_get_current_byte_index Получение позиции текущего байта документа int xml_get_current_byte_index (int parser) Нумерация байтов начинается с 0. xml_parse_into_struct Занесение документа XML в структурированный массив int xml_parse_into_struct (int parser, string data, array &values, array &index) Функция заносит XML-документ в 2 параллельные структуры: массив values содержит структуру тегов и их содержимое, a Index содержит вспомогательные индексы для облегчения нахождения начальных и конечных тегов в первом массиве (массивы следует передавать по ссылке). $simple = "<para><note>simple note</note> При запуске сценарий выводит: Index Arrayf [PARA] » Array ( [0] => 0 [1] =>
2 ) Интерпретация сложных документов становится громоздкой при использовании обработчиков. Хотя эта функция и не создает объект, подобный DOM, она генерирует структуру, которую легко преобразовать в древовидную. Можно, например, создавать объекты, представляющие данные. Следующий пример демонстрирует создание объектов из xml базы данных химических элементов. Файл, moldb.xml <?xml version="1.0"7> <moldb> Сценарий parsemoldb.php, интерпретатор файла moldb.xml: <?php class AminoAcid { // класс аминокислот После запуска сценария переменная $db будет содержать массив AminoAcid объектов и будет выведено: ** Database of AminoAcid objects: Array ( xml_parser_free Закрытие интерпретатора XML string xml_parser_free (int parser) xml_parser_set_option Установка параметра XML-интерпретатора int xml_parser_set_option (int parser, int option, mixed value) В аргументе option константой задается устанавливаемый параметр, а в value — ее новое значение. Возможные параметры:
xml_parser_get_option Получение параметра интерпретатора XML mixed xml_parser_get_option (int parser, int option) См. также: xml_parser_set_option(). utf8_decode Преобразование строки UTF-8 в ISO-8859-1. string utf8_decode (string data) См. также: utf8_encode(). utf8_encode Кодирование строки ISO-8859-1 в UTF-8 string utf8_encode (string data) Возвращает строку в формате UTF-8. UTF-8 — эго формат представления текста Unicode, позволяющий представить большее количество символов, чем кодировка ASCII. Первые 127 символов ASCII в кодировке UTF-8 имеют идентичное представление, а последующие (обычно это символы национальных языков) кодируются следующими способами: Кодировка UTF-8
Как видно, размер символа может быть от 1 до 4 бант; b представляет один бит данных. XSLT (Extensible Stylesheet Language (XSL) Transformations) — язык преобразований XML-документов в другие XML-документы; стандарт, определенный Консорциумом World Wide Web (W3C). С документацией можно ознакомиться по адресу: http://www.w3.org/TR/xslt. Технология предназначена для разделения содержания и формы представления документов с помощью шаблонов преобразования XSL. Обычно документы XML преобразовывают в формат HTML. Это расширение использует Sabloton и expat (http://www.gingerall. com/). В UNIX при компиляции PHP запустите configure с ключом -with-sablot. xslt_create Инициализация нового процессора XSL resource xslt_create(void); Функция возвращает дескриптор, используемый последующими XSL-функциями. xslt_free Закрытие процессора XSLT void xslt_free (resource xh) xslt_openlog Назначение журнала сообщений процессора XSLT bool xslt_openlog ([resource xh, string logfile, int loglevel]) В указанный файл logfile будут записываться все сообщения об ошибках. xslt_closelog Закрытие и очистка журнала сообщений процессора XSLT bool xslt_closelog (resource xh) xslt_errno Получение номера текущей ошибки процессора XSLT int xslt_errno ([int xh]) xslt_error Получение описания текущей ошибки mixed xslt_error ([int xh]) xslt_fetch_result Получение преобразованных данных из буфера string xslt_fetch_result ([int xh, string result_name]) Если имя буфера не указывается в result_name, то подразумевается «/jresult». xslt_output_ begintransform Начало преобразования XSLTc выводом void xslt_output_begintransform (string xslt_filename) Функция заставляет преобразовывать все выводимые данные с учетом шаблона из файла xslt_filename. Затем следует вызвать функцию xslt_output_endtransform(). <?php $xsl_file = "article.xsl"; xslt_output_endtransform Завершение преобразования, начатого xslt_output begintransform void xslt_output_endtransform (void); Эту функцию следует вызвать для того, чтобы вывести преобразованный документ. xslt_process Преобразование документа XML с помощью шаблона XSL bool xsH_process (string xsl_data, string xirHI_data, string result) В аргументе xsl_data указывается текст шаблона XSLT, а в xml_data — текст документа XML. Возвращает TRUE или FALSE — при ошибке. См. также: xslt_errno() и xslt_error() для получения кодов ошибки. <?php JxslData = xslt_run Применение XSLT к файлу bool xslt_run ([resource xh, string xslt_file. string xmt_data_file. string result, array xslt_params, array xslt_args]]]) Преобразовывает файл xm!_data_file, применяя к нему шаблон из файла xslt_file. Шаблон получает доступ к массиву параметров xslt_ params и аргументов xstt_args. Результат XSLT-трансформации заносится в именованный буфер (по умолчанию «_result»). xslt_set_sax_handler Установка обработчиков SAX для процессора XSLT bool xslt_set_sax_handler (resource xh. array handlers) xslt_transform Выполнение трансформации XSLT bool xslt_transforn> (string xsl, string xml, string result, string params, string args, string resultBuffer) Предоставляет расширенный интерфейс библиотеки Sablotron без необходимости использования ресурсов API.
|