Работа с XML средствами PHP

24.04.2013

Теги: DOMPHPWeb-разработка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
        )
)

Поиск: DOM • PHP • Web-разработка • XML

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.