Автор статьи: Головин Андрей
Все вы, наверное, слышали о дальнейшем развитии языка HTML под             названием XML             (eXtensible Markup Language).
            лучше понять суть этого языка можно на примере. Предположим, что             вы разрабатываете сайт интернет-магазина. Как вы будете создавать             дизайн описания товара? К примеру, так:
<B><DIV STYLE=»color: red, font-weight: bold»>Название товара.</DIV>
<DIV CLASS=»description>»>Описание товара.</DIV>
<DIV CLASS=»price»>320р.</DIV>
</B>
            XML позволяет записать данный код гораздо проще:
<NAME>Название</NAME><
DESCRIPTION>Описание</DESCRIPTION>
<PRICE>320р.</PRICE>
            XML позволяет полностью отделить содержание от дизайна. А это,             одна из основных задач, стоящая перед разработчиками в настоящее             время.
            К сожалению, не все браузеры могут корректно интерпретировать             этот язык. А те, которые могут, делают это еще не в полном объеме.             Но некоторые наработки из этой области можно использовать для             упрощения разработки страниц. Например, если у вас на странице             присутствуют часто повторяющиеся варианты оформления (например,             заголовки параграфов), то гораздо проще написать <SPAN             class=tag><HEADER>Новости</HEADER>, чем <SPAN             class=tag><DIV CLASS=»header»>Новости</DIV>
.
            В языке PHP присутствует библиотека процессора XML. Для ее             использования, первым делом, необходимо ее подключить. Для             операционных систем Windows необходимо вписать в файл php3.ini             строчку: &extension=php3_xml.dll. А для             юникс-систем, необходимо произвести конфигурацию, запустив программу             <B>configure</B> с ключом &—with-xml,             предварительно выкачав библиотеку <A             href=»http://www.jclark.com/xml/»>Expat</A> по адресу <A             href=»http://www.jclark.com/xml/»>http://www.jclark.com/xml/</A>.
            Теперь рассмотрим, как работает XML-процессор в PHP. Сначала             создается экземпляр процессора функцией xml_parser_create(). Далее необходимо написать             функции-обработчики событий. События возникают в те моменты, когда             процессор встречает какую-либо часть текста в документе. Части             текста бывают следующие (Рис.1):
            <TABLE align=center border=0>              <TBODY>              <TR>                <TD><center><img src=»/images/arti/blok10/0070_01.gif»></center></TD></TR>              <TR>                <TD align=right>Рис. 1.</TD></TR></TBODY></TABLE>            На самом деле, существует еще несколько типов содержимого, но для             нашей задачи этого достаточно.
            Обработчик события обнаружения начального элемента будет             вызываться в следующем виде: &startElement($parser,             $name, $attrs), где &$parser — ссылка на             текущий экземпляр XML-процессора, &$name — имя             элемента (в нашем случае — HEADER), &$attrs —             атрибуты элемента (каждый элемент XML может иметь атрибуты, как и             любой элемент HTML, например, <HEADER             COLOR=»red»>), содержащиеся в ассоциативном массиве             (например &$attrs[«COLOR»] будет содержать             &red в нашем случае).
            Обработчик события обнаружения конечного элемента — в следующем:             &endElements($parser, $name), где $parser — ссылка на текущий экземпляр             XML-процессора, &$name — имя элемента (в нашем             случае — HEADER).
            А обработчик обнаружения содержания: elementContent($parser, $data), где $parser — ссылка на текущий экземпляр             XML-процессора, &$data — содержание (в нашем             случае — «Заголовок»).
Затем эти функции должны быть назначены,             как обработчики событий функциями xml_set_element_handler() и xml_set_character_data_handler(). Первая функция
            В нашем случае вызов функции xml_set_element_handler() будет выглядеть так: xml_set_element_handler($xml_parser, «startElement»,             «endElement»), а функции обработки содержания: xml_set_character_data_handler($xml_parser,             «elementContents»).
            Функция &startElement() должна будет             заменить тэг <HEADER> на <DIV CLASS=»header»>, функция endElement() — тэг <SPAN             class=tag></HEADER> на <SPAN             class=tag></DIV>
, а функция elementContents() — просто вывести содержимое.
            Кроме того, необходимо предусмотреть, чтобы неизвестные с точки             зрения нашей программы тэги выводились без изменений. Это позволит             нам расширять шаблоны по мере необходимости.
            Таким образом программа интерпретации шаблона может выглядеть             таким образом:
><?
$starts = array(    "HEADER" => "<DIV CLASS=\"header\">"
);
$ends = array(
    "HEADER" => "</DIV>
"
);
function printAttrs($attrs) {
// Функция вывода атрибутов "неизвестных" тэгов
   while ( list($key,$val)=each($attrs) ) {
      echo " $key=\"$val\"";
   }
}
function startElement($parser, $name, $attrs)  {
   if ($starts[$name]) {
      print $starts[$name];
   } else {
      print "<$name";
      if (sizeof($attrs)>0) {
         printAttrs($attrs);
      }
      print ">";
   }
}
function endElement($parser, $name)  {
   if ($ends[$name]) {
      print $ends[$name];
   } else {
      print "</$name>";
   }
}
$xml_parser = xml_parser_create();
xml_set_element_handler(
   $xml_parser,
   "startElement",
   "endElement");
xml_set_character_data_handler(
   $xml_parser,
   "characterData");
xml_parser_set_option(
   $xml_parser,
   XML_OPTION_CASE_FOLDING,
   true);
$fp = fopen("data.pxml", "r");
while ($data = fread($fp, 4096)) {
  xml_parse($xml_parser, $data, feof($fp));
}
xml_parser_free($xml_parser);
$fclose($fp);
?>
            Функция задания установок процессора XML (xml_parser_set_option()), несмотря на всю мудреность             вызова производит преобразование названий элементов в верхний             регистр.
            Функция &xml_parse() запускает процесс             обработки входных данных (&$data), а функция             &xml_parser_free() — производит освобождение             ресурсов, занятых про конкретный экземпляр процессора XML.
            На самом деле, возможности данного метода, поистине,             неограниченны. Кроме «тупого» замещения простых тэгов сложными             конструкциями, возможно еще и создавать содержание «на лету». Но             никаких объемов сайта не хватит, чтобы все это описать, да и всегда             интереснее разобраться самому.