Xml set default handler: примеры (PHP)
xml_set_default_handler(resource parser, callable handler): boolОписание функции xml_set_default_handler
Функция xml_set_default_handler() является частью библиотеки XML Parser в PHP. Она устанавливает функцию-обработчик по умолчанию для XML-парсера.
Эта функция используется для обработки символьных данных (текста) и других событий XML, для которых не заданы специализированные обработчики (например, xml_set_element_handler). Обработчик по умолчанию вызывается для всех текстовых узлов, комментариев, инструкций по обработке (PI) и сущностей, если для них не установлен отдельный обработчик.
- parser (обязательный) - ресурс XML-парсера, созданный функцией xml_parser_create().
- handler (обязательный) - строка с именем функции обратного вызова (callback), которая будет вызываться при срабатывании события.
Функция-обработчик должна принимать два аргумента:
handler(resource $parser, string $data)
Где $parser - ссылка на текущий XML-парсер, $data - строковые данные, которые необходимо обработать.
Примеры использования
Этот пример показывает, как функция обрабатывает текстовое содержимое элементов.
<?php
function defaultHandler($parser, $data) {
echo "Обработано данных: " . htmlspecialchars($data) . "\n";
}
$xml = "<root>Пример<child>текста</child></root>";
$parser = xml_parser_create();
xml_set_default_handler($parser, "defaultHandler");
xml_parse($parser, $xml, true);
xml_parser_free($parser);
?>Обработано данных: Пример Обработано данных: текста
Показывает, как можно настроить парсер для сохранения или удаления пробелов.
<?php
function defaultHandler($parser, $data) {
if(trim($data) !== '') {
echo "Данные: '" . $data . "'\n";
}
}
$xml = "<doc> Текст </doc>";
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_set_default_handler($parser, "defaultHandler");
xml_parse($parser, $xml, true);
?>Данные: 'Текст'
Альтернативные функции в PHP
Объектно-ориентированный API для работы с XML. Предоставляет более высокоуровневый интерфейс.
- Предпочтительнее использовать: когда нужен полный доступ к DOM-дереву, XPath запросы, модификация структуры документа.
Упрощенный интерфейс для работы с XML, преобразующий элементы в объекты и массивы.
- Предпочтительнее использовать: для быстрого чтения и извлечения данных из простых XML-структур.
Потоковый pull-парсер с последовательным чтением.
- Предпочтительнее использовать: для обработки больших XML-файлов с минимальным потреблением памяти.
XML Parser (включая xml_set_default_handler) эффективен для потоковой обработки и когда требуется детальный контроль над парсингом.
Аналоги в других языках
Метод characters() в SAX-парсере обрабатывает текстовые данные.
import xml.sax
class DefaultHandler(xml.sax.ContentHandler):
def characters(self, content):
print(f"Данные: {content}")
parser = xml.sax.make_parser()
handler = DefaultHandler()
parser.setContentHandler(handler)
parser.parse("data.xml")Библиотека sax-js предоставляет потоковый парсер с событийной моделью.
const sax = require('sax');
const parser = sax.parser(true);
parser.ontext = function(text) {
console.log("Текст:", text);
};
parser.write('<root>Текст</root>').close();Функция для извлечения данных из XML с помощью XPath.
SELECT ExtractValue('<root><a>Текст</a></root>', '//a');Текст
Основное отличие PHP функции - событийно-ориентированный подход в сравнении с DOM или SAX моделями в других языках.
Типичные ошибки
<?php
$parser = xml_parser_create();
// Функция myHandler не существует
xml_set_default_handler($parser, "myHandler");
xml_parse($parser, "<root>test</root>", true);
?>Warning: xml_parse(): Unable to call handler myHandler() in ...
<?php
// Обработчик принимает только один аргумент вместо двух
function handler($data) {
echo $data;
}
$parser = xml_parser_create();
xml_set_default_handler($parser, "handler");
xml_parse($parser, "<root>test</root>", true);
?>Warning: handler() expects exactly 1 parameter, 2 given in ...
<?php
$parser = null;
xml_set_default_handler($parser, "handler");
?>Warning: xml_set_default_handler() expects parameter 1 to be resource, null given in ...
Изменения в версиях PHP
Функция xml_set_default_handler() оставалась стабильной в последних версиях PHP. Начиная с PHP 8.0.0, функция теперь выбрасывает исключение ValueError, если параметр $parser не является корректным ресурсом XML-парсера, вместо генерации предупреждения. В PHP 8.1.0 не было внесено изменений в работу этой функции.
Расширенные примеры
<?php
$fullText = '';
function collectText($parser, $data) {
global $fullText;
$fullText .= $data;
}
$xml = "<book><title>PHP 8</title><author>Иван</author></book>";
$parser = xml_parser_create();
xml_set_default_handler($parser, "collectText");
// Отключаем обработку элементов
xml_set_element_handler($parser, null, null);
xml_parse($parser, $xml, true);
xml_parser_free($parser);
echo "Полный текст: " . $fullText;
?>Полный текст: PHP 8Иван
<?php
function handleCData($parser, $data) {
echo "CDATA содержимое: " . $data . "\n";
}
$xml = "<content><![CDATA[<тег> внутри CDATA]]></content>";
$parser = xml_parser_create();
xml_set_default_handler($parser, "handleCData");
xml_set_element_handler($parser, null, null);
xml_parse($parser, $xml, true);
?>CDATA содержимое: <тег> внутри CDATA
<?php
function filterHandler($parser, $data) {
// Обрабатываем только данные длиной более 3 символов
if(strlen(trim($data)) > 3) {
echo "Значимые данные: " . trim($data) . "\n";
}
}
$xml = "<items><item>a</item><item>Длинный текст</item><item>bb</item></items>";
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_set_default_handler($parser, "filterHandler");
xml_set_element_handler($parser, null, null);
xml_parse($parser, $xml, true);
?>Значимые данные: Длинный текст
<?php
function startElement($parser, $name) {
echo "Начало: $name\n";
}
function endElement($parser, $name) {
echo "Конец: $name\n";
}
function defaultHandler($parser, $data) {
if(trim($data) !== '') {
echo "Текст: '" . trim($data) . "'\n";
}
}
$xml = "<root><element>Содержимое</element></root>";
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_default_handler($parser, "defaultHandler");
xml_parse($parser, $xml, true);
?>Начало: ROOT Начало: ELEMENT Текст: 'Содержимое' Конец: ELEMENT Конец: ROOT
PHP xml_set_default_handler function comments
- Php xml set default handler - аргументы и возвращаемое значение
- Функция php xml_set_default_handler - описание
- xml set default handler - примеры
- xml set default handler - похожие методы на php
- xml_set_default_handler на js, python, mysql
- xml set default handler изменения php
- Примеры xml_set_default_handler на php