Узнайте о расширении SimpleXML, входящем в состав PHP версии 5, которое позволяет страницам PHP запрашивать, искать, изменять и повторно публиковать XML в синтаксисе, удобном для PHP.
В PHP версии 5 представлен SimpleXML, новый интерфейс прикладного программирования (API) для чтения и записи XML. В SimpleXML следующее выражение:
$doc->rss->channel->item->title.
Выберите элементы из документа. Это выражение легко написать, если вы знакомы со структурой документа. Однако если неясно, где появляются необходимые элементы (например, в Docbooks, HTML и подобных описательных документах), SimpleXML может использовать выражения XPath для поиска этих элементов.
Начало работы с SimpleXML
Предположим, вам нужна страница PHP для преобразования RSS-канала в HTML. RSS — это простой формат XML для публикации связанного контента. Корневым элементом документа является rss, который содержит элемент канала. Элемент канала содержит метаданные о канале, такие как заголовок, язык и URL-адрес. Он также содержит различные отчеты, инкапсулированные в элементе item. Каждый элемент имеет элемент ссылки, который содержит URL-адрес, а также заголовок или описание (обычно и то, и другое), содержащее обычный текст. Пространства имен не используются. Конечно, RSS — это нечто большее, но для этой статьи этого достаточно. В листинге 1 показан типичный пример, содержащий две новости.
Листинг 1. RSS-канал
<?xml version="1.0"coding="UTF-8"?>
<rss-версия="0.92">
<канал>
<title>Мокка с шлагом</title>
<link>http://www.elharo.com/blog</link>
<language>ru</language>
<предмет>
<title>Пенсильванский вокзал: ушел, но не забыт</title>
<описание>
Старый Пенсильванский вокзал в Нью-Йорке снесли еще до моего рождения.
Глядя на эти фотографии, кажется, что это ошибка. Текущий сайт.
функциональный, но не более того, просто несколько офисных башен и подземелье;
коридоры, не представляющие особого интереса и красоты. Новая Мэдисон-сквер...
</описание>
<link>http://www.elharo.com/blog/new-york/2006/07/31/penn-station</link>
</item>
<предмет>
<title>Личное для Эллиотта Гарольда</title>
<description>Некоторые люди используют очень неприятные спам-фильтры, требующие от вас
чтобы ввести какую-нибудь случайную строку в вашей теме, например E37T, чтобы пройти.
Излишне говорить, что ни я, ни большинство других людей не удосуживаются общаться с
эти параноики слишком остро реагируют на проблему спама.
Лично я не буду...</description>
<link>http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/</link>
</item>
</канал>
</rss>
Давайте разработаем страницу PHP для форматирования RSS-канала в HTML. В листинге 2 показана базовая структура этой страницы.
Листинг 2. Статическая структура PHP-кода
<?php // Загрузка и анализ XML-документа ?>
<html xml:lang="en" lang="en">
<голова>
<title><?php // Заголовок будет прочитан из RSS ?></title>
</голова>
<body>
<h1><?php // Заголовок будет снова прочитан из RSS ?></h1>
<?php
// Здесь мы добавим цикл для включения заголовка и описания каждого элемента
?>
</body>
</html>
Анализ XML-документа.
Первым шагом является анализ XML-документа и сохранение его в переменной. Все, что для этого требуется, — это одна строка кода, передающая URL-адрес функции simplexml_load_file():
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
В этом примере я заполнил страницу из ленты New York Times Userland (по адресу http://partners.userland.com/nytRss/nytHomepage.xml ). Конечно, можно использовать любой URL-адрес другого RSS-канала.
Обратите внимание: хотя имя — simplexml_load_file(), на самом деле эта функция анализирует XML-документ по удаленному URL-адресу HTTP. Но это не единственная странность этой функции. Возвращаемое значение (здесь оно хранится в переменной $rss) не указывает на весь документ, как можно было бы ожидать, если вы использовали другие API, такие как объектная модель документа (DOM). Вместо этого он указывает на корневой элемент документа. Содержимое пролога и эпилога документа недоступно из SimpleXML.
Найдите заголовок канала.
Заголовок всего канала (а не заголовки отдельных статей в канале) расположен в дочернем заголовке канала корневого элемента rss. Найти заголовок легко, как если бы XML-документ представлял собой сериализованную форму объекта класса rss, причем само поле канала имело бы поле заголовка. Используя обычный синтаксис ссылок на объекты PHP, оператор поиска заголовка выглядит следующим образом:
$title = $rss->channel->title;
Найдя его, его можно добавить в выходной HTML. Сделать это легко, просто отобразите переменную $title:
<title><?php echo $title ?></title>;
Эта строка выводит строковое значение элемента, а не всего элемента. То есть текстовый контент записывается, но теги не включаются.
Вы даже можете полностью пропустить промежуточную переменную $title:
<title><?php echo $rss->channel->title ?></title>;
Поскольку страница повторно использует это значение в нескольких местах, мне удобнее хранить его в переменной с ясным смыслом.
…