Автор статьи: Головин Андрей
Все вы, наверное, слышали о дальнейшем развитии языка 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.
На самом деле, возможности данного метода, поистине, неограниченны. Кроме «тупого» замещения простых тэгов сложными конструкциями, возможно еще и создавать содержание «на лету». Но никаких объемов сайта не хватит, чтобы все это описать, да и всегда интереснее разобраться самому.