W3docs

xml_parser_create()

Функция xml_parser_create() в PHP создаёт новый XML-парсер для SAX-разбора. Узнайте синтаксис и примеры использования.

Функция xml_parser_create() — это встроенная функция PHP, которая создаёт новый XML-парсер. Она относится к устаревшему расширению xml (Expat) и используется для SAX-разбора (разбора, управляемого событиями). В отличие от высокоуровневых расширений, таких как SimpleXML или DOMDocument, этот парсер обрабатывает XML-данные последовательно, вызывая пользовательские функции обратного вызова для элементов, атрибутов и символьных данных.

Функция xml_parser_create() полезна, когда нужно выполнять потоковый разбор больших XML-файлов, извлекать определённые данные без загрузки всего документа в память или обрабатывать XML на низком уровне в событийно-ориентированном режиме.

Функция возвращает XML-парсер, который сохраняется в переменной и передаётся во все остальные функции xml_*. Начиная с PHP 8.0 она возвращает объект XMLParser; в более ранних версиях возвращался resource. В любом случае он используется как непрозрачный дескриптор — на нём устанавливаются обработчики, данные передаются с помощью xml_parse(), а затем он освобождается функцией xml_parser_free().

Синтаксис

Синтаксис функции xml_parser_create() выглядит следующим образом:

синтаксис функции xml_parser_create()

xml_parser_create([$encoding])

Где $encoding — кодировка символов XML-данных (например, "UTF-8", "ISO-8859-1" или "US-ASCII"). Этот параметр необязателен; если он не указан, парсер определяет кодировку из XML-декларации документа.

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

Рассмотрим несколько практических примеров использования xml_parser_create() в PHP.

Пример 1: Создание XML-парсера

Функцию xml_parser_create() можно использовать для инициализации ресурса парсера. Обратите внимание, что создание парсера само по себе не обрабатывает никакие данные; необходимо настроить обработчики и вызвать xml_parse(), чтобы фактически выполнить разбор XML.

использование функции xml_parser_create() для создания нового XML-парсера в PHP

$xml_parser = xml_parser_create();

Этот код создаёт новый ресурс XML-парсера. Сам по себе он является просто пустым контейнером, готовым к настройке.

Пример 2: Разбор XML-данных

Для фактического разбора XML необходимо настроить обработчики событий и передавать данные парсеру с помощью xml_parse().

использование функции xml_parser_create() для разбора XML-данных в PHP

$xml_parser = xml_parser_create();
$xml_data = file_get_contents("data.xml");

// Set up element handlers
xml_set_element_handler($xml_parser, function($parser, $name) {
    echo "Start element: $name\n";
}, function($parser, $name) {
    echo "End element: $name\n";
});

// Parse the data
if (!xml_parse($xml_parser, $xml_data, true)) {
    die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($xml_parser)),
        xml_get_current_line_number($xml_parser)));
}
xml_parser_free($xml_parser);

Этот код создаёт парсер, регистрирует обратные вызовы для открывающих и закрывающих тегов, и использует xml_parse() для обработки XML-файла. Парсер вызывает обратные вызовы по мере последовательного чтения данных.

Пример 3: Извлечение данных из встроенного XML

Этот самодостаточный пример выполняет разбор XML-строки и собирает текст каждого элемента в массив с помощью обработчика символьных данных. Он работает без каких-либо внешних файлов.

извлечение данных из XML с помощью расширения xml в PHP

$xml_data = <<<XML
<?xml version="1.0"?>
<book>
    <title>Learn PHP</title>
    <author>W3docs</author>
</book>
XML;

$xml_parser = xml_parser_create();
$current_tag = '';
$book = [];

xml_set_element_handler(
    $xml_parser,
    function ($parser, $name) use (&$current_tag) {
        $current_tag = $name; // element names arrive UPPERCASE by default
    },
    function ($parser, $name) use (&$current_tag) {
        $current_tag = '';
    }
);

xml_set_character_data_handler(
    $xml_parser,
    function ($parser, $data) use (&$current_tag, &$book) {
        $data = trim($data);
        if ($current_tag !== '' && $data !== '') {
            $book[$current_tag] = $data;
        }
    }
);

xml_parse($xml_parser, $xml_data, true);
xml_parser_free($xml_parser);

print_r($book);

Вывод:

Array
(
    [TITLE] => Learn PHP
    [AUTHOR] => W3docs
)

Обратите внимание, что ключи записаны в верхнем регистре. По умолчанию парсер Expat преобразует имена элементов в верхний регистр, поэтому обработчик сохраняет TITLE и AUTHOR, а не title и author. Чтобы сохранить исходный регистр, отключите свёртку регистра сразу после создания парсера:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

Обработчик символьных данных также может вызываться несколько раз для одного элемента (например, когда текст разбивается сущностями или переносами строк), поэтому в подобных случаях следует использовать конкатенацию с .= — здесь простое присваивание достаточно, поскольку каждое значение представляет собой одну короткую строку.

xml_parser_create() предназначена для событийно-ориентированного разбора и не выполняет проверку по схеме. Для XSD-валидации рекомендуются высокоуровневые расширения DOMDocument или SimpleXML.

Заключение

В этой статье мы рассмотрели функцию PHP xml_parser_create() и то, как с её помощью можно создать новый XML-парсер в стиле SAX. Мы объяснили, что делает функция, её синтаксис, и привели примеры настройки обработчиков и последовательного разбора XML-данных. Следуя этим примерам, вы сможете эффективно выполнять потоковый разбор XML-файлов и извлекать нужные данные в своих PHP-приложениях. Для большинства современных задач рекомендуется использовать SimpleXML или DOMDocument, которые предоставляют высокоуровневые API и встроенную валидацию без необходимости ручной настройки парсера.

Связанные функции

  • xml_parser_create_ns() — создание XML-парсера с поддержкой пространств имён.
  • xml_parse() — передача XML-данных парсеру и вызов обработчиков.
  • xml_set_element_handler() — регистрация обратных вызовов для открывающих и закрывающих тегов.
  • xml_set_character_data_handler() — регистрация обратного вызова для текстового содержимого.
  • xml_parser_set_option() — изменение параметров парсера, например свёртки регистра.
  • xml_parser_free() — освобождение парсера по завершении работы.
  • xml_error_string() — получение понятного сообщения об ошибке разбора.

Практика

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