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