Xml set default handler: примеры (PHP)

Использование функции xml_set_default_handler для парсинга XML в PHP
Раздел: XML
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

DOMDocument

Объектно-ориентированный API для работы с XML. Предоставляет более высокоуровневый интерфейс.

  • Предпочтительнее использовать: когда нужен полный доступ к DOM-дереву, XPath запросы, модификация структуры документа.
SimpleXML

Упрощенный интерфейс для работы с XML, преобразующий элементы в объекты и массивы.

  • Предпочтительнее использовать: для быстрого чтения и извлечения данных из простых XML-структур.
XMLReader

Потоковый pull-парсер с последовательным чтением.

  • Предпочтительнее использовать: для обработки больших XML-файлов с минимальным потреблением памяти.

XML Parser (включая xml_set_default_handler) эффективен для потоковой обработки и когда требуется детальный контроль над парсингом.

Аналоги в других языках

Python: xml.sax.handler.ContentHandler.characters

Метод 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")
JavaScript (Node.js): sax-js

Библиотека sax-js предоставляет потоковый парсер с событийной моделью.

const sax = require('sax');
const parser = sax.parser(true);

parser.ontext = function(text) {
    console.log("Текст:", text);
};

parser.write('<root>Текст</root>').close();
MySQL: ExtractValue()

Функция для извлечения данных из XML с помощью XPath.

SELECT ExtractValue('<root><a>Текст</a></root>', '//a');
Текст

Основное отличие PHP функции - событийно-ориентированный подход в сравнении с DOM или SAX моделями в других языках.

Типичные ошибки

Неверное имя callback-функции
<?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
<?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Иван
Обработка CDATA секций
Пример php
<?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
<?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
<?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

En
Xml set default handler Set up default handler