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()— получение понятного сообщения об ошибке разбора.