Работа с XML в PHP: DOMDocument, SimpleXML и XPath
XML (eXtensible Markup Language) остаётся одним из ключевых форматов для обмена данными, хранения конфигураций и интеграции с внешними сервисами (RSS-ленты, SOAP, API). PHP предоставляет несколько мощных встроенных расширений для работы с XML. В этой статье мы разберём три основных подхода: DOMDocument (объектная модель документа), SimpleXML (простой и интуитивный) и XPath (язык запросов для навигации).
1. Подготовка: пример XML-документа
Для всех примеров будем использовать один и тот же XML-файл catalog.xml:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="1">
<title>PHP для начинающих</title>
<author>Иван Петров</author>
<price currency="RUB">1200</price>
</book>
<book id="2">
<title>XML в деталях</title>
<author>Мария Сидорова</author>
<price currency="RUB">950</price>
</book>
</catalog>
2. DOMDocument — полный контроль над XML
Расширение DOMDocument реализует W3C DOM Level 2. Оно даёт максимальный контроль: можно создавать, удалять, изменять любые узлы, атрибуты и текстовое содержимое. Подходит для сложных сценариев, где требуется точное управление структурой.
Загрузка и чтение XML
<?php
$dom = new DOMDocument();
$dom->load('catalog.xml'); // или loadXML($xmlString)
$books = $dom->getElementsByTagName('book');
foreach ($books as $book) {
$id = $book->getAttribute('id');
$title = $book->getElementsByTagName('title')->item(0)->nodeValue;
$author = $book->getElementsByTagName('author')->item(0)->nodeValue;
$price = $book->getElementsByTagName('price')->item(0)->nodeValue;
echo "Книга #$id: $title — $author, $price руб.\n";
}
?>
Создание нового XML
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('catalog');
$dom->appendChild($root);
$book = $dom->createElement('book');
$book->setAttribute('id', '3');
$title = $dom->createElement('title', 'PHP и XML');
$book->appendChild($title);
$root->appendChild($book);
echo $dom->saveXML(); // выведет XML-строку
// $dom->save('new_catalog.xml');
?>
3. SimpleXML — простота и удобство
SimpleXML — это более лёгкое расширение, которое преобразует XML в объект с доступом к элементам через свойства. Идеально для быстрого чтения, особенно когда структура XML известна и не требует тонкой настройки.
Чтение XML с помощью SimpleXML
<?php
$xml = simplexml_load_file('catalog.xml'); // или simplexml_load_string($xmlString)
foreach ($xml->book as $book) {
$id = (string)$book['id'];
$title = (string)$book->title;
$author = (string)$book->author;
$price = (string)$book->price;
echo "Книга #$id: $title — $author, $price руб.\n";
}
?>
Создание XML через SimpleXML
<?php
$xml = new SimpleXMLElement('<catalog></catalog>');
$book = $xml->addChild('book');
$book->addAttribute('id', '4');
$book->addChild('title', 'SimpleXML Guide');
$book->addChild('price', 800)->addAttribute('currency', 'RUB');
echo $xml->asXML();
// $xml->asXML('output.xml');
?>
Изменение данных
<?php
$xml = simplexml_load_file('catalog.xml');
$xml->book[0]->price = 1300; // меняем цену первой книги
$xml->asXML('catalog_updated.xml');
?>