Если вы уже работали с XML, то знаете, что с помощью пространства имен (namespace) вы можете определять названия XML-элементов, ассоциируя их с определенным идентификатором URI, тем самым избегая возможных конфликтов между элементами, имеющими одинаковые имена. Однако использование одного идентификатора URI часто бывает недостаточно. Необходимо иметь такой способ, который бы позволял описывать пространство имен с помощью нескольких ресурсов, например, DTD, схемы XML, стилей XSL и сопроводительной документации к программному обеспечению.
Именно для этих целей и следует использовать язык RDDL. Как написано на официальном сайте RDDL: «RDDL предоставляет блок информации об определенном объекте… объекте из пространства имен XML…» (в разделе Ресурсы вы можете найти ссылку на официальный сайт RDDL). RDDL позволяет авторам документов предоставлять пользователям больше информации об определенных ресурсах. PHP-разработчики могут работать с данной информацией с помощью пакета XML_RDDL, который они могут загрузить из репозитория PEAR (PHP Extension and Application Repository). Пакет XML_RDDL предоставляет интерфейсы API, позволяющие извлекать разнообразную информацию о ресурсах из файла RDDL и использовать ее в PHP-приложении. Тем самым он предоставляет в ваше распоряжение надежный и простой в использовании виджет, который можно использовать в любом приложении PHP/RDDL.
Пакет XML_RDDL поддерживается Стефаном Шмидтом (Stephan Schmidt) и выпускается для сообщества PHP под лицензией PHP. Самый простой способ его установки – использование автоматического инсталлятора PEAR, который по умолчанию должен входить в состав PHP. Чтобы установить этот пакет, введите следующую команду в строку ввода вашей оболочки:
shell> pear install XML_RDDL
После ввода этой команды инсталлятор PEAR подключится к серверу пакетов PEAR, загрузит необходимый пакет и установит его в определенный каталог на вашем компьютере. В примерах, которые приводятся в данном документе, используется пакет XML_RDDL версии 0.9.
Чтобы вручную установить данный пакет, посетите его официальную страницу, загрузите архив, содержащий его исходный код, и вручную распакуйте содержимое этого архива в необходимый каталог. Учтите, что использование ручной установки предполагает наличие у вас определенных знаний об организационной структуре пакета PEAR.
Для работы с пакетом XML_RDDL также необходимо наличие другого PEAR-пакета - XML_Parser. Чтобы установить его, вы также можете либо воспользоваться автоматическим инсталлятором PEAR, либо установить его вручную, как это было описано выше, найдя все необходимые ссылки в разделе Ресурсы.
Знакомство с RDDL-дескрипторами
Для начала необходимо разобраться с принципами использования RDDL. Просмотрите листинг 1, в котором приведен пример использования RDDL:
Листинг 1. Пример XHTML-документа, в котором используется RDDL
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:rddl="http://www.rddl.org/" xml:lang="en">
<head>
<title>An Example RDDL Document</title>
</head>
<body>
<h2>An Example RDDL Document</h2>
<p>Here are some resources:</p>
<ul>
<li>
<rddl:resource xlink:type="simple"
xlink:href="http://app.example.domain/example.xsd"
xlink:role="http://www.w3.org/2000/10/XMLSchema"
xlink:title="Example XML Schema"
xlink:arcrole="http://www.rddl.org/purposes#schema-validation">
<a href="http://app.example.domain/example.xslt">An Example XML Schema</a>
</rddl:resource>
</li>
<li>
<rddl:resource id="dtd" xlink:type="simple"
xlink:href="http://app.example.domain/example.dtd"
xlink:role="http://www.isi.edu/in-notes/iana/assignments/media-types/
application/xml-dtd"
xlink:title="Example DTD"
xlink:arcrole="http://www.rddl.org/purposes#validation">
<a href="http://app.example.domain/example.dtd">An Example DTD</a>
</rddl:resource>
</li>
<li>
<rddl:resource xlink:type="simple"
xlink:href="http://app.example.domain/api.html"
xlink:role="http://www.w3.org/1999/xhtml"
xlink:title="Example API Reference"
xlink:arcrole="http://www.rddl.org/purposes#reference">
<a href="http://app.example.domain/api.html">An Example API Reference</a>
</rddl:resource>
</li>
<li>
<rddl:resource xlink:type="simple"
xlink:href="http://app.example.com/video.mpg"
xlink:role="http://www.isi.edu/in-notes/iana/assignments/media-types/video/mpeg"
xlink:title="Explanatory Video"
xlink:arcrole="http://www.rddl.org/purposes#software-package">
<a href="http://app.example.com/video.mpg">Explanatory Video</a>
</rddl:resource>
</li>
<li>
<rddl:resource xlink:type="simple"
xlink:href="http://app.example.com/video2.mpg"
xlink:role="http://www.isi.edu/in-notes/iana/assignments/media-types/video/mpeg"
xlink:title="Explanatory Video 2"
xlink:arcrole="http://www.rddl.org/purposes#software-package">
<a href="http://app.example.com/video2.mpg">Explanatory Video</a>
</rddl:resource>
</li>
</ul>
</body>
</html>
|
Как вы могли убедиться на примере, представленном в листинге 1, RDDL-документ является обычным XHTML-документом, но с одним важным дополнением: в нем используется элемент <resource> , который описывает ресурс, к которому обращаются из документа. Элемент <resource> является модифицированным XLink, который содержит атрибуты, описывающие название, цель, роль и назначение ресурса. В рассмотренном выше примере кода содержится список различных ресурсов: DTD, схема XML, XHTML-документ и два файла MPEG.
Из всех атрибутов, которые могут быть у <resource>, атрибуты title и href не требуют особых пояснений, т.к. они представляют собой описание и соответствующую URL-ссылку на ресурс. Атрибуты role и arcrole элемента <resource> более интересны. Атрибут role описывает тип ресурса, при этом он должен либо быть URI-указателем на пространство имен ресурса, либо должен привязываться к MIME-типу ресурса (список всех типов представлен на сайте http://www.rddl.org/natures/ (EN)). Атрибут arcrole указывает на назначение ресурса (список возможных вариантов представлен на сайте http://www.rddl.org/purposes/ (EN)).
Обратите внимание на то, что приведенные выше операторы можно использовать в RDDL версии 1.0. В январе 2004 была выпущена обновленная спецификация RDDL - RDDL 2.0, из которой был исключен элемент <resource> со всеми его атрибутами. В новой версии спецификации рекомендуется добавлять RDDL-информацию в стандартный элемент XHTML <a>, используя при этом атрибуты nature и purpose, которые эквивалентны атрибутам role и arcrole элемента <resource>. Но поскольку пакет XML_RDDL не поддерживает спецификацию RDDL 2.0, то примеры, рассматриваемые в данном документе, будут основаны на RDDL версии 1.0.
Доступ к RDDL-информации с помощью PHP
Если у вас есть XHTML-документ, в котором указаны RDDL-ресурсы, то к ним довольно просто получить доступ с помощью XML_RDDL. Просмотрите листинг 2, в котором представлен процесс получения списка RDDL-ресурсов из XHTML-документа с помощью PHP:
Листинг 2. Обработка RDDL-данных с помощью PHP
<?php
// добавляем файл
include 'XML/RDDL.php';
// создаем RDDL-обработчик
// обрабатываем RDDL-файл
$rddl = new XML_RDDL();
$rddl->parseRDDL('example.html');
// отображаем найденные ресурсы
print_r($rddl->getAllResources());
?>
|
В примере, представленном в
листинге 2, используется пакет XML_RDDL PHP, с помощью которого производится чтение информации из XHTML-файла, представленного в листинге 1, и извлечение из него всех необходимых ресурсов. Вначале происходит чтение из XML_RDDL-файла класса и инициализация экземпляра класса XML_RDDL. Затем используется метод класса parseRDDL() для обработки файла-источника (файл может находиться локально или на него может быть дана URL-ссылка). После завершения обработки документа метод getAllResources() возвращает список всех элементов <resource>, найденных в документе, в виде набора массивов.
В листинге 3 представлен фрагмент данных, выводимых с помощью кода, представленного в листинге 2:
Листинг 3. Результат, получаемый с помощью кода, представленного в листинге 2
Array
(
[0] => Array
(
[lang] => en
[type] => simple
[href] => http://app.example.domain/example.xsd
[role] => http://www.w3.org/2000/10/XMLSchema
[title] => Example XML Schema
[arcrole] => http://www.rddl.org/purposes#schema-validation
)
[1] => Array
(
[lang] => en
[type] => simple
[id] => dtd
[href] => http://app.example.domain/example.dtd
[role] => http://www.isi.edu/in-notes/iana/assignments/media-types/
application/xml-dtd
[title] => Example DTD
[arcrole] => http://www.rddl.org/purposes#validation
)
...
)
|
Цикл foreach() используется в PHP с целью преобразованию этого массива к виду HTML. В листинге 4 представлен процесс преобразования данных, а на рисунке 1 – конечный результат:
Листинг 4. Преобразование данных RDDL к табличному виду
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></title>
<style type="text/css">
table {
width:100%;
border-collapse:collapse;
}
td {
border: solid 1px black;
padding: 5px;
}
</style>
</head>
<body>
<h2>Resources</h2>
<?php
// добавляем файл
include 'XML/RDDL.php';
// создаем RDDL-обработчик
// обрабатываем RDDL-файл
$rddl = new XML_RDDL();
$rddl->parseRDDL('example.html');
// получаем массив всех ресурсов
// преобразуем его в таблицу
$resources = $rddl->getAllResources();
if (is_array($resources) && count($resources) > 0) {
?>
<table>
<tr>
<td>Resource</td>
<td>Description</td>
<td>Purpose</td>
<td>Role</td>
</tr>
<?php
foreach ($resources as $r) {
$purpose = explode('#', $r['arcrole']);
?>
<tr>
<td><a href="<?php echo $r['href']; ?>"><?php echo $r['href']; ?></a></td>
<td><?php echo $r['title']; ?></td>
<td><?php echo $purpose[1]; ?></td>
<td><a href="<?php echo $r['role']; ?>"><?php echo $r['role']; ?></a></td>
</tr>
<?php
}
?>
</table>
<?php
}
?>
</body>
</html>
|
Рисунок 1. Web-страница, созданная на основе данных RDDL
Сортировка ресурсов по типу и назначению
Описанный в предыдущем разделе метод getAllResources() возвращает все ресурсы, найденные в исходном файле. Но часто бывает необходимо получить данные только определенного типа, например, все ресурсы, связанные с проверкой подлинности (validation), или ресурсы другого типа. Пакет XML_RDDL содержит методы, позволяющие решить такую задачу. В листинге 5 представлены некоторые из этих методов:
Листинг 5. Получение определенного подмножества ресурсов
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rddl="http://www.rddl.org/"
xml:lang="en">
<head>
<title>An Example RDDL Document</title>
</head>
<body>
<pre>
<?php
// добавляем файл
include 'XML/RDDL.php';
// создаем RDDL-обработчик
// обрабатываем RDDL-файл
$rddl = new XML_RDDL();
$rddl->parseRDDL('example.html');
// получаем массив всех ресурсов определенного типа
// получаем массив всех DTD
echo "Resources by nature:\n";
foreach ($rddl->getResourcesByNature('http://www.isi.edu/in-notes/iana/assignments/
media-types/application/xml-dtd') as $r) {
echo $r['href'] . " \n";
}
echo "\n";
// получаем массив всех ресурсов определенного назначения
// получаем массив всех программных пакетов
echo "Resources by purpose:\n";
foreach ($rddl->getResourcesByPurpose('http://www.rddl.org/
purposes#software-package') as $r) {
echo $r['href'] . " \n";
}
echo "\n";
// находим определенный ресурс по его id
$dtd = $rddl->getResourceById('dtd');
if (is_array($dtd)) {
echo "Resource with id 'dtd':\n";
echo $dtd['href'];
}
?>
</pre>
</body>
</html>
|
В
листинге 5 представлены три важных метода: getResourcesByNature(), который принимает идентификаторы URI определенного типа и возвращает все ресурсы, связанные с этим типом; getResourcesByPurpose(), который возвращает все ресурсы, удовлетворяющие определенному назначению; getResourceById(), который принимает ID и возвращает ресурс, удовлетворяющий этому идентификатору. Использование данных методов целесообразно в тех случаях, когда необходимо получить ресурсы, удовлетворяющие определенным критериям.
На рисунке 2 показан результат выполнения кода из листинга 5:
Рисунок 2. Подмножество ресурсов, возвращенное кодом из листинга 5
Как вы могли убедиться из приведенных выше примеров, пакет XML_RDDL предоставляет в ваше распоряжение полезный PHP-инструмент, с помощью которого можно быстро получать доступ к определенным частям информации о ресурсах, представленных в XHTML- документе, в котором присутствует RDDL. Попробуйте использовать его в следующий раз, когда вам необходимо будет обработать документ такого типа. Думаем, вы останетесь довольны конечным результатом!
Научиться
-
Оригинал статьи - Tip: Parsing RDDL documents with PHP (EN).
- Посетите официальный сайт RDDL (EN), на котором вы сможете найти отличный обзор языка RDDL.
- Изучите спецификации RDDL 1.0 (EN) и RDDL 2.0 (EN), в которых вы найдете больше информации о языке RDDL, а также наглядный, доступный для понимания материал об объектах пространства имен XML с каталогом ресурсов по каждому объекту.
- На сайте
PEAR (EN) вы можете найдите другие пакеты, связанные с PHP и XML-разработкой.
- Прочтите статью «RDDL with your
XML and Web services namespaces» (EN), в которой описывается процесс создания полезных руководств для пользователей ваших XML-документов и Web-служб (developerWorks, Uche Ogbuji, май 2004).
- В разделе
XML на сайте developerWorks вы найдете ссылки на ресурсы, с помощью которых вы сможете повысить свой профессиональный уровень XML-разработчика.
- Посетите сайт
IBM XML certification (EN), на котором вы узнаете, как пройти сертификацию по XML и смежным технологиям.
- Посетите сайт
технической библиотеки XML (EN), на которой вы сможете найти большое количество технических статей, руководств, советов по использованию, стандартов и литературы серии IBM Redbooks. Для получения полного списка советов по использованию XML, отсортированных по дате, выполните поиск в технической библиотеке (EN).
- Будьте всегда в курсе событий с помощью сайта
технических мероприятий и Web-трансляций developerWorks (EN).
- Посетите сайт магазина технической литературы (EN), если вам необходимо найти книги или другую техническую справочную литературу.
Получить продукты и технологии
- Загрузите пакет XML_RDDL (EN), с помощью которого вы сможете извлекать RDDL-ресурсы из XML-документов.
- Загрузите пакет XML_Parser (EN), основанный на встроенном в PHP расширении xml. Этот класс обработки XML основан на использовании библиотеки «expat» и поддерживает два основных режима работы, первый из которых связан с обработкой определенных функций, а второй - определенных событий.
- Создайте свой новый проект с помощью испытательных версий ПО, которое вы можете загрузить непосредственно с сайта
developerWorks IBM trial software (EN).
Обсудить
- Примите участие в обсуждении материала на форуме.
- Примите участие в форумах, посвященных
XML (EN).
- После прочтения данной статьи вы можете оставить свои комментарии на форуме developerWorks XML zone: Share your thoughts (EN). Редакторы статей раздела XML, которые также являются модераторами на этом форуме, будут вам благодарны за ваши отзывы.
- Участвуйте в
блогах (EN) и в жизни сообщества developerWorks (EN).
Викрам Васвани (Vikram Vaswani) – основатель и президент консалтинговой фирмы Melonfire, специализирующейся на технологиях и инструментах с открытым исходным кодом. Также является автором книг Решения по программированию на PHP and Как сделать все что угодно с помощью PHP и MySQL .