Комплексная обработка данных

 

WDDX

Данная группа функций разрешает трудиться с данными в формате WDDX (http://www.wddx.org/). WDDX (Web Distributed Data Exchange) — это спецтехнология для «Распределенного обмена данными в web». Данный формат (производный от XML) предуготовлен для переноса данных из одной системы в иную (скажем, обмена данными между ASP, Perl, ColdFusion и PHP). Он разрешает сберегать не только значения, но и типы, и конструкцию трудных данных. Следственно данные WDDX, сериализированные в одной системе, могут применяться в иной. Тип данных определяется механически и приводится к одному из следующих:

  • null — пустые значения;
  • bool — булевские значения;
  • number — числа (целые и дробные не различаются);
  • string — строки;
  • dateTime — значения даты и времени;
  • array — нумерованные массивы;
  • struct — ассоциативные массивы;
  • recordset — комплекты записей (подобие таблиц);
  • binary — двоичные данные (в кодировке Base64).

В различие от стандартных средств сериализации РНР данные функции применяют формат, поддерживаемый множеством программных сред.

<?php $pi = 3.1415926.
Spacketjd = wddx_packet_start("Комментарий пакета"):
wddx_add_vars($packet_id. "pi");
/* возможен Scities получено из БД
*/ Scities = arrayt"Austin". "Seattle");
wddx_add_vars($packet_id, "cities");
print Spacket = wddx_packet_end($packet_id); ?>

Пример выведет:

<wddxPacket version='1.0'><header comnent='Комментарий пакета'/>
<data><struct><var name='pi'><number>3.1415926</number>
</var> <var name='cities'xarra.y 1 ength='2' >
<string>Austin</string<str1ng>Seattle</stnng>
</array> </var></btruct></data></wddxPacket>

wddx_serialize_value

Занесение одного значения в пакет WDDX

string wddx_serialize_value (mixed var [, string comment])

Создает пакет WDDX из значения одной переменной var, добавляя в заголовок пакета комментарий comment, и возвращает полученный пакет.

<?php print wddx_senalize_valueC"WDDX
packet example". "PHP packet"); ?>

Пример выведет:

<wddxPacket version='1.0'><header comment''PHP packet'/>
<data> <stnng>WDDX packet example</stnng></data>
</wddxPacket>

wddx_serialize_vars

Создание пакета WDDX из нескольких значений

string wddx_serialize_vars (mixed varjiame [. mixed ...])

<?php $a = 1; $b - 5.5; $c = arrayC'blue". "orange", "violet"):
$d = "colors"; $clvars = arrayC'c". "d")-.
print wddx_serialize_vars("a". "b", Sclvars); ?>

Пример выведет:

<wddxPacket version= '1.0'><header/><data><st.ruct>
<va г name='a'><number>l</number></va r>
<vdr name='b'><number>5 5</number></var>
<var name='c'><array length='3'><string>blue
</string> <string>orange</string><stnng>violet</stnng>
</array></var> <var name='d'><stnng>colors</string>
</var> </struct></<jata></wddxPacket>

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)

Возвращает данные такого типа, которые были сериализированы.

DOM XML

Функции доступны при компиляции с параметром —with-dom=[DIR] при применении библиотеки GNOME xml (не ниже libxml-2.0.0).

Модуль определяет следующие константы (типы элементов XML):

  1. XML_ELEMENT_NODE;
  2. XML_ATTRIBUTE_NODE;
  3. XML_TEXT_NOOE;
  4. XML_CDATA_SECTION_NODE;
  5. XML_ENTITY_REF_NODE;
  6. XMLJNTITYJODE;
  7. XML_PI_NODE;
  8. XML_COMMENT_NODE;
  9. XiCJDOCUMENTJODE;
  10. XML_DOCUMENT_TYPE_NODE;
  11. XML_DOCUMENT_FRA6_NODE;
  12. XMLJOTATIONJODE;
  13. XML_GLOBAL_NAMESPACE;
  14. XML_LOCAL_NAMESPACE.

Модуль использует следующие классы для работы с интерфейсом DOM документов XML: DomDocument, DomNode, Dtd, DomAttribute, Dom-Namespace, XpathContext, XpathObject.

Рекомендуется применять объектный интерфейс, но допустимо применение и функции с префиксом domxml_, как аналога способов DOM объектов.

Класс DomDocument:

  • способ root() - аналог domxml_root();
  • способ children() — аналог domxml_children();
  • способ add_root() — аналог domxm1_add_root();
  • способ dtd() — аналог domxml_intdtd();
  • способ dumpmem() — аналог domxmU);
  • способ xpath_init() — аналог xpath_init();
  • способ xpath_new_context() — аналог xpath_new_context();
  • способ xptr_new_context() — аналог xptr_new_context();
  • качество doc — сам объект класса DomDocument;
  • качество name — название документа;
  • качество url — адрес документа;
  • качество version — версия XML;
  • качество encoding — наименование кодировки;
  • качество standalone — 1, если файл одиночный;
  • качество type — см. список констант;
  • качество compression — 1, если файл сжатый;
  • качество charset — номер кодировки.
Класс DomNode:
  • способ lastchild() - аналог domxmljast_child{);
  • способ children() — аналог domxmljrhildren();
  • способ parent() — аналог domxml_parent();
  • способ new_child() — аналог domxml_new_child();
  • способ get_attribute() — аналог domxml_get_attribute();
  • способ set_attribute() — аналог domxml_set_attribute();
  • способ attributes() — аналог domxml_attributes();
  • способ node() — аналог domxml_node();
  • способ set_content() — аналог domxml_set_contentО;
  • качество node — сам обьект класса DomNode;
  • качество type — см. список констант;
  • качество name — строка, содержащая имя тега;
  • качество content — строка содержимого тега.

<?php $doc - new_xmldoc("l 0"); // DomDocument
Sroot = $doc->add__root;"HTML"). // DomNode
Shead - $root->new_child("HFAD". "");
$head->new_child("TITLE". "Hier der Titel"):
echo $doc->dumpmem(); ?>

Сценарий выводит следующее:

<?xml version="l 0"?>
<HTML><HEAD><TITLE>Hier der Titel
</TITLE></HEAD></HTML>

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"?>
<HTML><HEAD Language="ge">
<TITLE>Title OF DOC</TITLE></HEAD></HTML>':
var_dump(xmltree($sXMD);

Будет выведено следующее:

object(0om0ocument)(5) {
["version"]=> stnng(3) "1.0" ["standalone"]=> int(-l)
["type"]=> int(9) XML_DOCUMENT_NODE
["children"]=> array(l) {
[0]=> &object(DomNode)(5) { ["name"]=>
stnng(4) "HTML" ["type"]=> int(l) ["content"]=>
string(12) "Title OF DOC" ["node"]=>
resource(6) of type (domxml node) ["children"]=>array(D {
[0]=> object(DomNode)(6) {
["name"]=> stnng(4) "HEAD" ["type"]=>
int(l) ["content"]=> stnng(12) "Title OF DOC" ["node"]=>
resource(7) of type (domxml node) t"attnbutes"]=> array(l) {
[0]=> object(DomAttnbute)(2) {
["name"]=> string(8) "Language" ["children"]=>array(D {
[0]=> object(DomNode)(4) {
["name"]=> stnng(4) "text" ["type"]=> int(3) ["content"]=>
stnng(2) "ge" ["node"]=>resource(8) of type
(domxml node) ["children"]=> array(l) {
[0]=> object(DomNode)(5) {
["name"]=> stnng(5) "TITLE" ["type"]=> int(l)
["content"]=> stnng(12) "Title OF DOC"
["node">> resourceO) of type (domxml node)
["children"]=> array(l) {
[0]=> object(DomNode)(4) { ["name"]=>
stnng(4) "text" C"type"]=> int(3) ["content"]=>
string(12) "Title OF DOC" ["node"]» resource(lO)
of type (domxml node) ["root"]=>&object(DomNode)(5) {
["name"]=> stnng(4) "HTML"["type"]=> int(l)
["content"]=> stnng(12) "Title OF DOC"
["node"]=> resource(6) of type (domxml node)
["children"]=> array(l) { tO]=> object(DomNode)(6) {
["name"]=> stnng(4) "HEAD" ["type"]=> int(l)
["content"]=> string(12) "Title OF DOC"
["node"]=> resource(7) of type (domxml node)
["attributes"]=> array(l) { [0]=> object(DomAttnbute)(2) {
["name"]=> string(8) "Language" ["children"]=>array(D {
[0]=> object(DomNode)(4) {
["name"]=> stnng(4) "text" ["type"]=>int(3)
["content"]=> string(2) "ge" ["node"]=>
resource(8) of type (domxml node) ["children"]=>array(D {
[0]=> object(DomNode) (5) {
["name"]=> string(5) "TITLE" ["type"]=> int(l)
["content"]=> stnng(12) "Title OF DOC" ["node"]=>
resource(9) of type (domxml node) ["children"]=> array(l) {
[0]=? object(DomNode)(4) { ["name"]=> stnng(4)
"text" C"type"]=> int(3) ["content"]=> stnng(12)
"Title OF DOC" ["node"]=> resource(lO)
of type (domxml node)

Интерфейс 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
$root = $doc->add_root("ML").
// DomNode <ML></ML> $root->new_child("Hl". "1212");
// <H1>1212</H1>
$p=$root->new_child("Pp". "Tttt tt");
// <Pp>Tttt tt</Pp> $p->set_attnbute("Id"."8")
// <Pp Id="8"> echo $doc->dumpmem();
$d=domxml_children($doc->root()); // Sroot. <ML></ML>
var_dump($d);
$d=domxml_children($d[l]). // <Pp Id="8">Tttt tt</Pp>
varjJump($d); // "Tttt tt" $d=domxml_children($d[0]);
// = bool(FALSE)

Пример выводит следующее:

<?xml version="l 0"?> <ML>
<Hl>1212</Hl><Pp Id="8">Tttt tt</Pp></ML>
array(2) { [0]=> object(DomNode)(4) {
["name"]=> stnng(2) "HI"
["content"]=> stnng(4) "1212"
t"node"]=> resource(6) of type (domxml node)
["type"]=> int(l) )
[!]=> object(DomNode)(4) { ["name"]=> stnng(2) "Pp"
["content"]=> stnng(7) "Tttt tt"
["node"]=> resource(7) of type (domxml node)
["type"]=> int(l) } }
arr-ay(l) { [0]=> object(DomNode)(4) {
["name"]=> stnng(4) "text" ["content"]=> stnng(7) "Tttt tt"
["node"]=> resource(8)
of type (domxml node) ["type"]-> int(3) } }

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"):
// OomDocument Sroot = $doc->add_root("ML");
// DomNode $h=$root->new_child("Hl". "1212"):
Sp-Sroot^newj^ildC'Pp'1! "Tttt tt"): $p->
set_attnbute("Id"."8"). $p->set_attnbute("Bold"."").
echo $doc->dumpmem(); var_dump($p->attributes()):
var_dump($h->attnbutes()): // var_dump($p->getattr("Id")):

Пример выведет следующее:

<?xml version="1.0"?> <ML><Hl>1212</Hl>
<Pp Id="8" Bold="">Tttt tt</Pp></ML>
array(2) { [0]=> object(DomAttnbute)(2)
{ ["name"]=> string(2) "Id" ["children"]=> array(l) {
[0]=> object(DomNode)(4) { ["name"]=> stnng(4)
"text" ["type"]=> int(3) ["content"J=> stnng(l)
"8" ["node"]=> resource(S) of type (domxml node)
[!]=> object(DomAttnbute)d) {
["name"]=> stnng(4) "Bold" } }
booHFALSE) stnng(I) "8"

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-истолковывание

XML (extensible Markup Language) — формат обмена структурированными данными в пространстве web; эталон, определенный Консорциумом World Wide Web (W3C). Информацию о XML и связанных спецтехнологиях дозволено получить по адресу http://www.w3.org/XML/. Для понимания материала главы нужно разбираться в синтаксисе XML

Для работы с документами XML применяются два метода.

  1. Применение объектной модели документа (DOM), которая комфортна для работы с документом в совокупности, но расходует огромнее источников.
  2. Истолковывание документа на основе модели событий, комфортная при однократном просмотре документа и менее требовательная к источникам (что главно при работе с объемными документами).

1-й метод рассмотрен в предыдущей главе. Функции, описанные в данной главе, реализуют 2-й метод обработки. Событийная модель обработки (интерпретации) подразумевает следующую схему функционирования программы.

  • Устанавливаются функции обработки элементов документа разного типа (скажем, маркеров, данных,-инструкций и т. д.).
  • Инициализируется и запускается интерпретатор, тот, что ступенчато просматривает документ и запускает соответствующие обработчики данных.
  • Функции-обработчики определенным образом обрабатывают передаваемые им фрагменты документа.

Подметьте, что интерпретатор предуготовлен для обработки документа, но не для его проверки; документ должен соответствовать грамматике 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_set_element_handler() — обработчики исходных и финальных тегов;
  • xml_set_character_data_handler() — текст между тегами (с учетом пробелов);
  • xml set_processing_instruction_handler() — инструкции обработки (скажем, <?php ?> и сходственные им; инструкция <?xml ?> зарезервирована);
  • xml_set__default_handler() — обработчик по умолчанию, применяемый при неосуществимости применения другого обработчика;
  • xm"l_set_unparsed_entity_decl_handler() — обработчик необрабатываемых (NDATA) данных;
  • xml_set_notation_decljiandler() — обработчик нотаций;
  • xml_set_external_entity_ref_handler() — обработчик внешних ссылок.

Коды ошибок

Модулем интерпретатора XML определяются следующие константы кодов ошибок (возвращаемые функцией xml_parse()):

  • XML_ERROR_NONE;
  • XML_ERROR_NO_MEMORY;
  • XML_ERROR_SYNTAX;
  • XML ERRORJO ELEMENTS;
  • XML_ERROR_INVALIDJOKEN;
  • XML_ERROR_UNCLOSED_TOKEN;
  • XML_ERROR_PARTIAL_CHAR;
  • XMLJRRORJAG MISMATCH;
  • XML_ERROR_DUPLICATE_ATTRIBUTE;
  • XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
  • XML_ERROR_PARAM_ENTITY_REF;
  • XML_ERROR_UNDEFINED_ENTITY;
  • XML_ERROR_RECURSIVE_ENTITY_REF;
  • XMLJRROR_ASYNC_ENTITY;
  • XML_ERROR_BAD_CHAR_REF;
  • XML_ERROR_BINARY_ENTITY_REF;
  • XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
  • XML_ERROR_MISPLACED_XML_PI;
  • XMLJRRORJJNKNOWN ENCODING;
  • XML_ERRORJNCORRECT_ENCODING;
  • XML_ERROR_UNCLOSED_CDATA_SECTION;
  • XML_ERROR_EXTERNAL_ENTITY_HANDLING.

Примеры

Следующие примеры показывают возможности интерпретации документов XML.

Распечатка конструкции XML документа

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

Sfile = "data.xml": Sdeptti = аггау()
function startElement($parser. $name. Sattrs)
{ global Sdepth:
for ($1 = 0. $1 < $depth[$parser]; $i++) { print "". }
print "$name\n": $depth[$parser]++; }
function endElement($parscr. $name)
{ global $depth- $depth[$parser]--; }
$xml_parser = xml_parser_create().
xml__set_element_nandler
($xml_parser. "startElement", "endElement"):
if (!($fp = fopen($file. "r"») {
dieC'could not open XML input")
while «data = fread($fp. 4096)) {
ll(!xml_parse($xml_parser, $data. feof($fp)))
{ die(sprintf("XML error: Xs at line id".
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_l ine__number($xml_parser)));
xml_parser_free($xml на-se"):

Преобразование тегов XML в HTML

$file = "data xml '. $jndp_array = arrayt
"BOLD" > "B". "EMPHASIS" => "I".
"LITERAL" => "TT' );
function startElement($parset . $пате. Sattrs)
{ global $map_array; if (ShtTiltag = $map_array[$namej)
{ print "<$htmltag>'. function endElanenttSparser. $namp)
{ global $mao_array. if (Shtmltag - $map_array[$name]) (
print "</$htmltag>"; } } function characterData(Sparser. $data) {
print Sdata: } $xml_parser = xml_parser_create();
// отключить восприимчивость к регистру
xml_parser_set_option
($xml_parser. XML_OPTION_CASE_FOLDING. TRUE):
xml_set_element_handler
($xml_parser. "startElement". "endElement");
xml_set_character_data_handler
($xml_parser. "characterData");
if (!($fp = fopen($file. "r")))
{ dieC'could not open XML input"); } while (Sdata = fread(Sfp. 4096)) {
if (!xml_parse($xml_parser. Sdata. feof($fp)))
{ die(spnntf("XML error: £s at line %u".
xml_error_string(xml_get_error_code
(Sxml_parser)). xml_get_current_line_number($xml_parser))): }
} xml_parser_free($xml_parser).

Обработка особых конструкций XML

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

$file = "xmltest.xml"; function trustedFile(Sflle) {
// исполнять код дозволено только в
собственных файлах if (!eregi(""([a-z]+)://". Sfile)
&& fileowner(Sfile) == getmyuid()) ( return TRUE; }
return FALSE. }
function startElement(Sparser. $name. Sattribs) {
print "&lt;<font color=\"#OOOOcc\">Sname</font>"
: if (sizeof(Sattnbs)) { while (list(Sk. $v) = each(Sattnbs))
{ print " <font color=\"#009900\">
$k</font>=\"<font color=\"#990000\">$v</font>\"": } }
print "&gt;": }function endElement(Sparser. Sname) {
print "&lt;/<font color=\"#0000cc\">$name</font>&gt;": }
function characterData(Sparser. $data)
{ print "<b>Sdata</b>"; }
function PIHandler($parser. Starget. $data)
{ switch (strtolower(Starget)) { case "php":
global $parser_file.
// Проверим возможно ли выпрямить код PHP из документа
// либо ограничиться его простым отображением
if (trustedFile($parser_file[Sparser]))
eval($data). else pnntfC'Kofl PHP: <i>fc</i>".
htmlspecialchars(Sdata)): break; } }
function defaultHandler($parser, Sdata) {
if (substrtSdata, 0. 1) == "&" && substr(Sdata. -1. 1)
== ".") { pnntf ('<font color="#aaOOaa">Us</font>'.
html sped a lchars (Sdata)): } else {
printf('<font size="-l">£s</font>'.
htmlspecialchars(Sdata)); } }
function externalEntityRefHandler
(Sparser, SopenEntityNames.
$base. Ssystemld. Spublicld) { if (Ssystemld) {
if (!list($parser. Sfp) = new_xml_parser(Ssystemld)) {
printf("Необрабатываемая сегмент %s в позиции
Zs\n". SopenEntityNames. Ssystemld);
return FALSE; } while (Sdata = fread($fp. 4096)) {
if (!xml_parse(Sparser. Sdata. feof(Sfp))) {
pnntfC'XML error: Is в стороке %d '%s'
\n". xml_error_string(xml_get_error_code($parser))
. xml_get_currentline_number($parser).
$openEntityNames): xml_parser_free($parser);
return FALSE: } }
xml_parser_free(Sparser). return TRUE; }
return FALSE: }
function new_xml_parser($file)
{ global $parser_file:
$xml_parser = xml_parser_create():
xml_parser_set_option
($xml_parser. XML_OPTION_CASE_FOLDING. 1):
xml_set_element_handler
($xml_parser. "startElement". "endElement"):
xml_set_character_datajiandler
($xml_parser. "characterOata");
xml_set_processing_instruction_handler($xml_parser.
"PIHandler"): xml_set_default_handler
($xml_parser. "defaultHandler"):
xml_set_external_entity_ref_handler
($xml_parser, "externalEntityRefHandler"):
if (!($fp = @fopen($file. "r"))) { return FALSE. }
if (!is_array($parser_file)) { settype($parser_file, "array"); }
Sparser_file[$xml_parser] =
$file. return array($xml_parser. $fp);}
//----------------------.......
if (!(list($xml_parser. $fp) =
new_xml_parser($file))) { dieC'could not open XML input"); }
print "<pre>"; while (Sdata = freadUfp. 4096)) {
if (!xml_parse($xml_parser. Sdata. feof($fp)))
{ die(spnntf("XML error ^s at line *d\n". xml_error_string
(xml_get_error_code
($xml_parser)). xml_get_current_line_number($xml_parser)));} }
print "</pre>": print "parse completed";
xml_parser_free($xml_parser):

Содержимое файла xmltest.xml:

<?xml version='1.0">>
<!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [
<!ENTITY plainEntity "FOO entity">
<!ENTITY systemEntity SYSTEM "xmltest2.xml"> ]>
<chapter> <TITLE>Title &plainEntity:</TITLE> <para>
<informaltable> <tgroup cols="3">
<tbody> <row><entry>al</entry>
<entry morerows="l">bl</entry>
<entry>cl</entry></row> <row><entry>a2</entry>
<entry>c2</entry></row> <row><entry>a3</entry>
<entry>b3</entryxentry>c3</entry></row> </tbody>
</tgroup> </informaltable> </para> SsystemEntity.
<sectl id="about">
<title>About this Document</title> <para>
<!-- this is a comment -->
<?php print 'Hi! PHP version ' .phpverslon(): ?>
</para> </sectl> </chapter>

Подключаемый файл xmltest2.xml:

<?xml version="1.0"?> <!DOCTYPE foo [
<!ENTITY testEnt "test entity"> ]> <foo>
<element attnb="value"/> StestEnt;
<?php print "This is PHP code."; ?> </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.
function xml (){ // конструктор
$this->parser - xml_j>arser_create();
xml_set_object($this->parser.&$thi s):
xml_set_element_handler
($this->parser."tag_open"."tag_close"):
xml_set_character_data_handler($this->parser."cdata"); }
function parse($data) ( xml parse(5this->parser.$data). }
function tag_oper,(Sparser.Stag.tattnbutes) {
echo "** Tag open: ": var dump($tag.$attributes). }
function cdata($parser.$cdata) {
echo " ++ Data: ": varjJump($cdita): }
function tag_close(Sparser.$tag) {
echo "** Tag close: "; var_dump($tag): }
} // end of class xml $xml_parser = new xml():
$xml_parser-parse('<A ID="99">PHP
<z a="d"/>aaa</A>') ?>

При запуске пример выведет:

** Tag open: stnng(l) "A" array(l) { f"IO"]=> stnng(2) "99"}
++ Data stnng(4) "PHP "
** Tag open: stnng(l) "Z" array(l) { ["A">>
stnng(l) "d" } ** Tag close: stnng(l) "Z"
t-+ Data: stnng(3) "aaa" ** Tag close: stnng(l) "A"

xml_set element_handler

Предназначение обработчиков открывающего и закрывающего тега

int xml_set_element_hand1er (int parser, string startElementHandler, string endElementHandler)

В доводах startElementHandler и endElementHandler указываются имена пользовательских функций, вызываемых во время интерпретации (при вызове xml_parse()), когда интерпретатор встречает открывающие и закрывающие теги.

Функции обязаны принимать следующие доводы:

  • startElementHandler (Int parser, string name, array attribs)
  • endElementHandler (int parser, string name)

Довод 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>
</para>"; $р = xml_parser_create();
xml_parse_i nto_struct($p.Ssimple.&$vais.&$т ndex);
xml_parser_free($p). echo "Index "; pnnt_r($index),
echo "\nVals ": pnnt_r($vals);

При запуске сценарий выводит:

Index Arrayf [PARA] » Array ( [0] => 0 [1] => 2 )
[NOTE] => Array ( [0] => 1 ) ) Vals Array(
[0] => Array ([tag] => PARA
[type] => open [level] => 1 ) [1] -> Array ([tag] => NOTE
[type] => complete [level] => 2 [value] => simple note )
[2] => Array ([tag] => PARA k [type] => close
[level] => 1 ; }

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

Файл, moldb.xml

<?xml version="1.0"7> <moldb>
<molecule> <name>Al am ne</name>
<symbol>ala</symbol> <code>A</code>
<type>hydrophobic</type> </molecule>
<molecule> <name>Lysine</name>
<symbol>lys</symbol> <code>K</code>
<type>cha rged</type> </molecule> </moldb>

Сценарий parsemoldb.php, интерпретатор файла moldb.xml:

<?php class AminoAcid { // класс аминокислот
var Sname; // aa имя var Ssymbol:
// трехбуквенный символ var Scode:
// однобуквенный код var Stype: // свойства
function AminoAcid ($aa) { foreach ($aa as $k=>$v)
Sthis->$k = $aa[$k]; } }
function readDatabase(Sfllename) {
// read the xml database of arrrinoacids
Sdata = implode("",file(Sfilename));
Sparser = xml_parser_create();
xml_parser_set_option
($parser.XML_OPTION_CASE_FOLDING,0):
xml_parser_set_option
($parser.XML_OPTION_SKIP_WHITE.l).
xml_parse_into_struct(Sparser,Sdata,&$values.&$tags),
xml_parser_free($parser).
// loop through the structures foreach
($tags as $key=>$val) { if ($key == "molecule")
{ $molranges = $val;
for ($i=0. $1 < count($molranges):
$1+=2) { Soffset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - Soffset: $tdb[]
= parseMol(array_slice($values. Soffset. Slen)): }
} else { continue: } } return $tdb: }
function parseMol($mvalues) {
for ($i=0; $1 < count($mvalues); $i++)
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"]:
return new AminoAcid($mol): }
$db = readDatabaseC'moldb.xml"):
echo "** Database of AminoAcid objects: ";
pnnt_r($db): ?>

После запуска сценария переменная $db будет содержать массив AminoAcid объектов и будет выведено:

** Database of AminoAcid objects: Array (
[0] => aminoacid Object (
[name] => Alamne [symbol] => ala [code] =>
A [type] => hydrophobic ) [1] => aminoacid Object
( ~\ [name] => Lysine \ [symbol] => lys
[code] => К [type] => charged j )

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_OPTION_CASE_FOLDING (тип значения параметра -- integer) -управляет реформированием имен тегов в верхний регистр (по умолчанию — 1);
  • XML_OPTION_TARGET_ENCODIN6 (тип значения параметра - string) -целевая кодировка: «ISO-8859-1», «US-ASCII» либо «UTF-8». По умолчанию та же, что и установленная функцией xml_parser_ create().

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

7

Obbbbbbb

2

И

llObbbbb lObbbbbb

3

16

lllObbbb lObbbbbb lObbbbbb

4

21

llllObbb lObbbbbb lObbbbbb lObbbbbb

Как видно, размер символа может быть от 1 до 4 бант; b представляет один бит данных.

XSLT

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_begintransform($xsl_file):
Sdoc = new_xmldoc('1.0').
Sarticle = $doc->new_root('article'};
$article->new_child('title'. 'The History').
$article->new_child('author'. 'Peter'),
$article->new_child('body'. 'Nothing interesting has happened'):
echo $doc->dumpmem(); xslt_output_endtransform(). ?>

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 =
<xsl:stylesheet version="l 0"
xmlns:xsb"http-//www.w3 org/1999/XSL/Transfonn">
<xsl template match="article">
<table border="l" cellpadding="2" cellspacing="l"> <tr>
<td vndth="800">
<h2><xsl value-of select,="title"></h2> <h3>
<xsl value-of select="author"></h3>
<br><xsl.value-of select="body"> </td> </tr>
</table> </xsl-templdte> </xsl:stylesheet>
SxmlData ' ' <?xml version^"!.0"?> <article>
<title>Learning Language</title>
<author>I Myself</author> <body>
Essential phrases: <br> <br> Hello.
Good day.<br> </body> </article>';
if (xslt_process($xs!Data. SxmlData. $resuH.O {
echo "Here is the article:<br>\n<br>", Sresult;
} else ( echo "Оплошность реформирования XSL.
\nUHonep' " xslt_errno() .
"\п\Описание: " xslt_error() . "\n"; exit: } ?>

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.