Работа с XML средствами PHP
24.04.2013
Теги: DOM • PHP • Web-разработка • XML
Давайте начнем с самого простого: загрузки и выгрузки XML-документа с использованием DOM. Основной класс, который мы будем использовать, это DOMDocument. Через него можно создавать новые документы, сохранять их, а также загружать существующие.
<?php // Создаём XML-документ версии 1.0 с кодировкой utf-8 $dom = new DOMDocument('1.0', 'utf-8'); // Текст XML-документа $strXML = '<?xml version="1.0" encoding="utf-8"?><root><item>Первый</item><item>Второй</item></root>'; // Загружаем XML-документ из строки $dom->loadXML($strXML); /* // Загружаем XML-документ из файла $dom->load('doc.xml'); // Убираем лишние пробелы и отступы $dom->preserveWhiteSpace = false; */ // Сохраняем XML-документ как строку и выводим в браузер $xml = $dom->saveXML(); echo htmlspecialchars($xml); // Сохраняем XML-документ в файл $dom->save('doc.xml'); ?>
Как получить список дочерних узлов
<?php // Создаём XML-документ $dom = new DOMDocument('1.0', 'utf-8'); // Текст XML-документа $strXML = '<?xml version="1.0" encoding="utf-8"?><root><item>Первый</item><item>Второй</item></root>'; // Загружаем XML-документ из строки $dom->loadXML($strXML); // Получаем корневой элемент <root> $root = $dom->documentElement; // Получаем список дочерних узлов <root> $childs = $root->childNodes; for ($i = 0; $i < $childs->length; $i++) { $child = $childs->item($i); // Выводим информацию об узле echo $child->nodeName . ' : ' . $child->nodeValue . '<br/>'; } ?>
Свойство nodeName содержит название элемента (в данном случае, item), а nodeValue содержимое элемента (в данном случае, «Первый» и «Второй»).
Работа с атрибутами узлов
Давайте посмотрим, как получить значение атрибута узла, устанавить новое значение, создать и удалить атрибут:
<?php // Создаём XML-документ $dom = new DOMDocument('1.0', 'utf-8'); // Текст XML-документа $strXML = '<?xml version="1.0" encoding="utf-8"?><root><item id="1">Первый</item><item>Второй</item><item>Третий</item></root>'; // Загружаем XML-документ из строки $dom->loadXML($strXML); // Получаем корневой элемент <root> $root = $dom->documentElement; // Первый дочерний элемент <root> $first = $root->firstChild; // Следующий сестринский элемент $second = $first->nextSibling; // Последний дочерний элемент <root> $third = $root->lastChild; // Выводим информацию о первом дочернем элементе <root> echo 'Элемент ' . $first->nodeName . ', значение «' . $first->nodeValue . '», атрибут id=' . $first->getAttribute('id'); // Устанавливаем атрибут id для второго дочернего элемента <root> $second->setAttribute('id', 2); // Устанавливаем атрибут id для третьего дочернего элемента <root> $attr = $dom->createAttribute('id'); $attr->value = 3; $third->appendChild($attr); // Удаляем атрибут id для третего дочернего элемента <root> if ( $third->hasAttribute('id') ) $third->removeAttribute('id'); ?>
Создание XML-документа
<?php // Создаём XML-документ $dom = new DOMDocument('1.0', 'utf-8'); // Создаём корневой элемент <users> $root = $dom->createElement('users'); $dom->appendChild($root); $users = array( array('id' => 1, 'name' => 'Николай Петров', 'email' => 'petrov.n@mail.ru'), array('id' => 2, 'name' => 'Петр Иванов', 'email' => 'ivanov.p@mail.ru'), array('id' => 3, 'name' => 'Сергей Смирнов', 'email' => 'smirnov.s@mail.ru') ); foreach ( $users as $value ) { // Создаём узел <user> $user = $dom->createElement('user'); // Добавляем дочерний элемент для <users> $root->appendChild($user); // Устанавливаем атрибут id для узла <user> $user->setAttribute('id', $value['id']); // Создаём узел <name> с текстом внутри $name = $dom->createElement('name', $value['name']); // Добавляем дочерний элемент для <user> $user->appendChild($name); // Создаём узел <email> $email = $dom->createElement('email'); // Создаем текстовой узел $text = $dom->createTextNode($value['email']); // Создаем текстовой узел внутри конструкции <![CDATA[ ... ]]> // $text = $dom->createCDATASection($value['email']); // Добавляем текстовой узел для <email> $email->appendChild($text); // Добавляем дочерний элемент для <user> $user->appendChild($email); } // Сохраняем полученный XML-документ в файл $dom->save('users.xml'); ?>
Содержимое файла users.xml:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>Николай Петров</name>
<email>petrov.n@mail.ru</email>
</user>
<user id="2">
<name>Петр Иванов</name>
<email>ivanov.p@mail.ru</email>
</user>
<user id="3">
<name>Сергей Смирнов</name>
<email>smirnov.s@mail.ru</email>
</user>
</users>
Извлечение данных из xml-документа
Давайте теперь извлечем данные из документа users.xml обратно в массив:
<?php // Создаём XML-документ $dom = new DOMDocument('1.0', 'utf-8'); // Загружаем XML-документ из файла $dom->load('users.xml'); // Получаем корневой элемент $root = $dom->documentElement; // Получаем дочерние элементы корневого элемента $users = $root->childNodes; // Перебираем полученные элементы foreach ($users as $user) { // Получаем значение атрибута id узла <user> $id = $user->getAttribute('id'); // Получаем дочерние элементы узла <user> $info = $user->childNodes; // Получаем значение узла <name> $name = $info->item(0)->nodeValue; // Получаем значение узла <email> $email = $info->item(1)->nodeValue; // Записываем данные в массив $array[] = array('id' => $id, 'name' => $name, 'email' => $email); } print_r($array); ?>
Результат работы скрипта:
Array ( [0] => Array ( [id] => 1 [name] => Николай Петров [email] => petrov.n@mail.ru ) [1] => Array ( [id] => 2 [name] => Петр Иванов [email] => ivanov.p@mail.ru ) [2] => Array ( [id] => 3 [name] => Сергей Смирнов [email] => smirnov.s@mail.ru ) )
- SimpleXML. Начало работы
- DOM, часть 4 из 4. Атрибуты и свойства
- DOM, часть 3 из 3. Поиск элементов
- DOM, часть 2 из 3. Изменение документа
- Браузерные события, часть 5 из 5. Генерация пользовательских событий
- Браузерные события, часть 4 из 5. Действие браузера по умолчанию
- Браузерные события, часть 3 из 5. Делегирование
Поиск: DOM • PHP • Web-разработка • XML