W3docs

PHP XML Parser

PHP — популярный язык для веб-разработки. Узнайте, как работать с XML в PHP с помощью SimpleXML: чтение, запись и обработка данных.

PHP — популярный язык сценариев для веб-разработки, позволяющий создавать динамические сайты за счёт встраивания кода в HTML. Одной из наиболее полезных возможностей PHP является работа с XML — языком разметки, предназначенным для хранения и передачи данных.

В этом руководстве мы рассмотрим функциональность PHP для работы с XML, включая её преимущества, синтаксис и примеры использования. По завершении вы будете понимать, как работать с XML для создания лучших сайтов и приложений.

Что такое XML?

XML расшифровывается как «eXtensible Markup Language» (расширяемый язык разметки). Это язык разметки, позволяющий разработчикам определять собственные теги и структуры документов, что делает его гибким и настраиваемым. XML широко используется для хранения и передачи данных — например, в веб-сервисах, базах данных и RSS-лентах.

XML похож на HTML, однако если HTML определяет способ отображения веб-страниц в браузере, XML определяет структуру и содержимое данных. Теги XML служат для обозначения элементов данных и их взаимосвязей, упрощая обмен данными между различными системами.

Преимущества использования XML в PHP

Использование XML в PHP предоставляет ряд преимуществ, в том числе:

  • Обмен данными: XML — идеальный формат для обмена данными между различными системами и платформами. Поскольку XML не зависит от платформы, данные легко передаются между системами вне зависимости от операционной системы или используемого языка программирования.
  • Хранение данных: XML отлично подходит для хранения и организации данных в структурированном формате. Используя XML для хранения данных, разработчики могут легко получать к ним доступ и манипулировать ими по мере необходимости.
  • Преобразование данных: XML легко преобразуется в другие форматы, такие как HTML, PDF и CSV, с помощью XSLT (Extensible Stylesheet Language Transformations).

Синтаксис XML в PHP

Для работы с XML в PHP необходимо знать синтаксис, используемый при определении XML-документов. XML-документы состоят из элементов, атрибутов и значений.

Элементы определяются с помощью открывающих и закрывающих тегов, например <book> и </book>. Элементы также могут содержать дочерние элементы:

<book>
  <title>The Great Gatsby</title>
  <author>F. Scott Fitzgerald</author>
</book>

Атрибуты используются для предоставления дополнительной информации об элементах, например:

<book id="1234">
  <title>The Great Gatsby</title>
  <author>F. Scott Fitzgerald</author>
</book>

Значения — это содержимое элемента, например «The Great Gatsby» или «F. Scott Fitzgerald».

Какой подход к XML выбрать?

PHP поставляется с тремя парсерами, и выбор подходящего имеет значение:

  • SimpleXML — наиболее простой API. Он преобразует XML-документ в дерево объектов, по которому можно перемещаться с помощью обычного синтаксиса свойств ($xml->book->title). Лучший выбор для небольших и средних документов с известной структурой. Это руководство сосредоточено на SimpleXML; более подробный справочник см. в PHP SimpleXML.
  • DOMDocument (расширение DOM) — полная реализация W3C DOM. Более многословный, но позволяет точно создавать, перемещать и удалять узлы, а также необходим для XSLT и валидации. См. PHP XML DOM.
  • XMLReader / XMLWriter — потоковый, управляемый парсером. Он читает по одному узлу за раз вместо загрузки всего дерева в память, поэтому это правильный выбор для очень больших файлов (сотни МБ), где SimpleXML и DOM исчерпали бы память.

Исторические SAX-функции xml_parser_create() по-прежнему существуют, но редко используются в новом коде; SimpleXML покрывает ту же область с гораздо меньшим количеством шаблонного кода.

Чтение XML-документа с помощью SimpleXML

Для загрузки XML-файла в дерево объектов используйте функцию simplexml_load_file(). Если источником является строка (например, ответ API), а не файл, используйте вместо неё simplexml_load_string().

Всегда проверяйте возвращаемое значение: при некорректном документе обе функции возвращают false, а не генерируют исключение, поэтому непроверенный результат является распространённой причиной скрытых ошибок.

$xml = simplexml_load_file("books.xml");
if ($xml === false) {
    echo "Failed to load XML file.";
    exit;
}

Это читает XML-файл и преобразует его в объект SimpleXMLElement, к которому вы обращаетесь с помощью объектно-ориентированного синтаксиса PHP. Дочерние элементы становятся свойствами, а повторяющиеся элементы (например, несколько тегов <book>) ведут себя как итерируемый список.

Чтение атрибутов

Атрибуты — не свойства; для их чтения используется синтаксис массива на элементе. Для <book id="1234"> идентификатор читается как $book['id']:

$xml = simplexml_load_string('<book id="1234"><title>The Great Gatsby</title></book>');
echo $xml['id'];     // 1234
echo $xml->title;    // The Great Gatsby

Обратите внимание, что значения SimpleXML являются объектами, а не обычными строками. Приводите к типу (string), когда нужна настоящая строка (например, перед строгим сравнением или json_encode).

Запись XML-документа с помощью SimpleXML

Чтобы создать XML с нуля, создайте SimpleXMLElement с корневым элементом и добавьте дочерние элементы с помощью addChild():

$xml = new SimpleXMLElement('<books></books>');
$book = $xml->addChild('book');
$book->addChild('title', 'The Great Gatsby');
$book->addChild('author', 'F. Scott Fitzgerald');
$xml->asXML('books.xml');

Этот код создаёт SimpleXMLElement с корневым элементом <books>, добавляет дочерний элемент <book> с дочерними элементами <title> и <author> и сохраняет документ в файл books.xml. Вызов asXML() без аргумента возвращает XML в виде строки вместо записи в файл, что удобно при отправке данных в HTTP-ответе.

Примеры использования

Рассмотрим несколько практических примеров работы с XML в PHP.

Чтение XML-данных

Предположим, у вас есть XML-файл «books.xml» со следующими данными:

<books>
  <book>
    <title>The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
  </book>
  <book>
    <title>To Kill a Mockingbird</title>
    <author>Harper Lee</author>
  </book>
</books>

Чтобы прочитать эти данные в PHP, можно использовать функцию simplexml_load_file():

$xml = simplexml_load_file("books.xml");
if ($xml === false) {
    echo "Failed to load XML file.";
    exit;
}
foreach ($xml->book as $book) {
  echo $book->title . " by " . $book->author . "\n";
}

Этот код загружает XML-файл в объект SimpleXMLElement, а затем перебирает каждый элемент <book> с помощью цикла foreach. Внутри цикла он обращается к дочерним элементам <title> и <author> с помощью объектно-ориентированного синтаксиса и выводит их в консоль.

Запись XML-данных

Предположим, вы хотите создать новый XML-файл со следующими данными:

<colors>
  <color>
    <name>Red</name>
    <hex>#FF0000</hex>
  </color>
  <color>
    <name>Green</name>
    <hex>#00FF00</hex>
  </color>
  <color>
    <name>Blue</name>
    <hex>#0000FF</hex>
  </color>
</colors>

Для создания этих XML-данных в PHP можно использовать класс SimpleXMLElement:

$xml = new SimpleXMLElement('<colors></colors>');
$red = $xml->addChild('color');
$red->addChild('name', 'Red');
$red->addChild('hex', '#FF0000');
$green = $xml->addChild('color');
$green->addChild('name', 'Green');
$green->addChild('hex', '#00FF00');
$blue = $xml->addChild('color');
$blue->addChild('name', 'Blue');
$blue->addChild('hex', '#0000FF');
$xml->asXML('colors.xml');

Этот код создаёт новый объект SimpleXMLElement с корневым элементом <colors>. Затем добавляет три дочерних элемента <color>, каждый из которых содержит два дочерних элемента <name> и <hex>, и устанавливает их значения соответственно. Наконец, сохраняет XML-документ в файл «colors.xml».

Распространённые подводные камни

  • Непроверенный результат загрузки. simplexml_load_file() и simplexml_load_string() возвращают false, а не null, при ошибке разбора. Проверяйте с помощью === false перед использованием результата.
  • Значения являются объектами, а не строками. $xml->title — это SimpleXMLElement. Он работает в строковых контекстах (echo, конкатенация), но выдаёт неожиданные результаты при сравнении; используйте приведение (string), если сомневаетесь.
  • Подавленные ошибки разбора. Чтобы узнать причину сбоя разбора, вызовите libxml_use_internal_errors(true) перед загрузкой, затем прочитайте libxml_get_errors().
  • Пространства имён. Если ваш XML использует пространства имён (например, xmlns:), обычный доступ к свойствам не найдёт элементы — используйте children() или xpath() с зарегистрированным пространством имён.
  • Ненадёжный ввод. Не разбирайте XML из ненадёжных источников без осторожности: атаки на внешние сущности (XXE) представляют реальную угрозу. В современном PHP загрузка соответствующих сущностей по умолчанию отключена, но перед обработкой XML, поступающего от пользователей, это следует проверить.

Связанные темы

Заключение

В этом руководстве мы рассмотрели, что такое XML, чем он полезен, а также как читать, записывать и обрабатывать XML в PHP с помощью библиотеки SimpleXML, и указали на распространённые подводные камни. SimpleXML — самый быстрый способ работы со структурированными XML-данными в PHP; используйте DOMDocument, когда нужен точный контроль над узлами, и XMLReader для очень больших файлов. Обратите внимание, что XML-функции PHP требуют расширения libxml, которое по умолчанию включено в большинстве стандартных установок.

Практика

Практика
Какие утверждения о работе с XML в PHP с использованием SimpleXML верны?
Какие утверждения о работе с XML в PHP с использованием SimpleXML верны?
Was this page helpful?