MyTetra Share
Делитесь знаниями!
DOM в PHP: Быстрое знакомство
Время создания: 25.10.2013 14:58
Текстовые метки: php, dom, xml
Раздел: Компьютер - Программирование - Язык PHP
Запись: xintrea/mytetra_syncro/master/base/1382698721o0gqvj60dt/text.html на raw.github.com

Здесь рассмотрена работа с объектной моделью документа на примере RSS-ленты.

Цель: вкратце показать как формируется и парситься (разбирается) XML-документ методами DOM.

Часть 1: Создаём

// Создаём новый документ.

// Первый параметр конструктора - версия XML, второй - кодировка

$doc_feed = new DOMDocument('1.0', 'UTF-8');

// Любой XML-документ - это дерево узлов. Дерево всегда имеет единственный

// корневой узел - в нашем случае это rss (<rss>...</rss>).

// Создадим элемент с помощью метода createElement

$elem_rss = $doc_feed->createElement('rss');

// Установим для созданного элемента атрибут "version" со значением "2.0"

$elem_rss->setAttribute('version', '2.0');

// Добавим созданый элемент в документ. Т.к. элемент - первый, он становится

// корнем дерева узлов:

$doc_feed->appendChild($elem_rss);

// Создадим элемент channel и добавим его в узел в rss

$elem_channel = $doc_feed->createElement('channel');

$elem_rss->appendChild($elem_channel);

// Далее последовательно создадим и добавим в channel

// узлы title, link, description, language, pubDate (именно в таком виде,

// т.к. XML регистрозависим)

$elem_channel->appendChild( $doc_feed->createElement('title', 'Заголовок RSS-канала') );

$elem_channel->appendChild( $doc_feed->createElement('link', 'http://www.pyha.ru') );

$elem_channel->appendChild( $doc_feed->createElement('description', 'Описание канала') );

$elem_channel->appendChild( $doc_feed->createElement('language', 'ru') );

$elem_channel->appendChild( $doc_feed->createElement('pubDate', date('r')) );

// Теперь добавим в узел channel 3 узла item

for ( $i = 0; $i < 3; ++$i ) {

$elem_item = $doc_feed->createElement('item');

$elem_channel->appendChild($elem_item);

// Создаём для item дочерние элементы

$elem_item->appendChild( $doc_feed->createElement('title', 'Заголок сообщения') );

$elem_item->appendChild( $doc_feed->createElement('link', 'http://www.pyha.ru/somepath') );

$elem_item->appendChild( $doc_feed->createElement('description', 'Описание сообщения') );

}

// Сохраняем документ в файле sample.rss

$doc_feed->save('sample.rss');

В результате получится такой код (только без отступов и знаков переноса)

<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0">

<channel>

<title>Заголовок RSS-канала</title>

<link>http://www.pyha.ru</link>

<description>Описание канала</description>

<language>ru</language>

<pubDate>Fri, 20 Jul 2007 16:25:59 +0600</pubDate>

<item>

<title>Заголок сообщения</title>

<link>http://www.pyha.ru/somepath</link>

<description>Описание сообщения</description>

</item>

<item>

<title>Заголок сообщения</title>

<link>http://www.pyha.ru/somepath</link>

<description>Описание сообщения</description>

</item>

<item>

<title>Заголок сообщения</title>

<link>http://www.pyha.ru/somepath</link>

<description>Описание сообщения</description>

</item>

</channel>

</rss>

Часть 2: Разбираем

// Теперь загружаем документ с помощью метода load

$doc_feed = DOMDocument::load('sample.rss');

// Первый дочерний элемент документа - rss,

// первый дочерний элемент rss - channel - т.о. получим элемент channel

$elem_channel = $doc_feed->firstChild->firstChild;

// Получим title (первый дочерний элемент узла channel)

$channel_child = $elem_channel->firstChild;

// Выведем поочередно содержимое дочерних элементов узла channel:

// title, link, description, language и pubDate. Выводить будем пока не встретиться

// элемент, у которого имя тега - item

print "<strong>n";

while ( $channel_child->tagName != 'item' ) {

print $channel_child->nodeValue . "

n";

$channel_child = $channel_child->nextSibling;

}

print "</strong>n";

// Метод getElementsByTagName() применим как к объекту DOMDocument так и к

// DOMElement (как показано далее). В первом случае он вернёт все элементы

// с указанным тегов, во втором - только в рамках указанного узла:

// Получим и пройдёмся по всем узлам item

$list_items = $elem_channel->getElementsByTagName('item');

print "<dl>n";

foreach ( $list_items as $elem_item ) {

// Элементы, дочерние для item

// первый элемент (firstChild) - title,

// следующий (nextSibling) - link

// последний элемент (lastChild) - description

print "<dt>" . $elem_item->firstChild->nodeValue . "</dt>n"

. "<dd>" . $elem_item->firstChild->nextSibling->nodeValue

. "

" . $elem_item->lastChild->nodeValue . "</dd>n";

}

print "</dl>n";

В результате:

Заголовок RSS-канала

http://www.pyha.ru

Описание канала

ru

Fri, 20 Jul 2007 16:25:59 +0600

Заголок сообщения

http://www.pyha.ru/somepath

Описание сообщения

Заголок сообщения

http://www.pyha.ru/somepath

Описание сообщения

Заголок сообщения

http://www.pyha.ru/somepath

Описание сообщения

Вроде всё. Методов, конечно, гораздо больше, но изучить скорее всего не составит труда.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования