Xml parser set option: примеры (PHP)

Настройка XML-парсера через xml_parser_set_option в PHP
Раздел: XML
xml_parser_set_option(resource parser, int option, mixed value): bool
Описание функции xml_parser_set_option

Функция xml_parser_set_option() изменяет параметры XML-парсера, созданного функцией xml_parser_create(). Эта функция используется при обработке XML-документов с помощью событийного парсера Expat, когда требуется изменить стандартное поведение парсера.

Аргументы функции

Функция принимает три параметра:

  1. parser - ресурс XML-парсера
  2. option - константа, определяющая изменяемую опцию:
    • XML_OPTION_CASE_FOLDING (int) - включает или отключает приведение имен тегов к верхнему регистру (по умолчанию включено)
    • XML_OPTION_SKIP_TAGSTART (int) - количество символов, которые нужно пропустить от начала имени тега
    • XML_OPTION_SKIP_WHITE (int) - пропускать ли пробельные символы (1 - да, 0 - нет)
    • XML_OPTION_TARGET_ENCODING (string) - устанавливает целевую кодировку для парсера
  3. value - новое значение опции, тип зависит от конкретной опции
Простые примеры использования
Отключение приведения к верхнему регистру
<?php
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

function startHandler($parser, $name, $attrs) {
    echo "Тег: $name\n";
}

xml_set_element_handler($parser, "startHandler", null);
xml_parse($parser, '<Root><Child>текст</Child></Root>', true);
xml_parser_free($parser);
?>
Тег: Root
Тег: Child
Установка целевой кодировки
<?php
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

echo "Кодировка парсера: " . xml_parser_get_option($parser, XML_OPTION_TARGET_ENCODING);
xml_parser_free($parser);
?>
Кодировка парсера: UTF-8
Пропуск пробельных символов
<?php
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

function charHandler($parser, $data) {
    if (trim($data) !== '') {
        echo "Данные: '$data'\n";
    }
}

xml_set_character_data_handler($parser, "charHandler");
xml_parse($parser, '<root>  текст  </root>', true);
xml_parser_free($parser);
?>
Данные: 'текст'
Похожие функции в PHP
XMLReader

Класс XMLReader предоставляет последовательное чтение XML-документов, менее требователен к памяти чем DOM. Предпочтительнее для обработки больших файлов.

SimpleXML

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

DOMDocument

Полная реализация DOM для PHP, позволяет манипулировать XML-документами как деревом узлов. Подходит для сложных операций с XML-структурами.

Функция для получения текущих значений опций XML-парсера. Используется вместе с xml_parser_set_option для проверки установленных параметров.

Альтернативы в других языках
Python: xml.parsers.expat
import xml.parsers.expat

parser = xml.parsers.expat.ParserCreate()
parser.buffer_text = True  # Аналог управления буферизацией

# В Python нет прямой аналогии XML_OPTION_CASE_FOLDING
# Обработка регистра осуществляется через другие механизмы
JavaScript: DOMParser
const parser = new DOMParser();
const xmlDoc = parser.parseFromString('<root><item>test</item></root>', 'text/xml');

// В JavaScript настройки парсера ограничены
// Нет аналогов опциям Expat-парсера PHP
MySQL: ExtractValue()
SELECT ExtractValue('<root><a>текст</a></root>', '/root/a');
-- MySQL использует XPath для извлечения данных из XML
-- Нет прямого аналога пошагового парсинга
Типичные ошибки
Неверный тип аргумента option
<?php
$parser = xml_parser_create();
// Передача строки вместо константы
$result = xml_parser_set_option($parser, 'XML_OPTION_CASE_FOLDING', 0);
var_dump($result);
?>
bool(false)
Некорректное значение для опции
<?php
$parser = xml_parser_create();
// Передача массива вместо скалярного значения
$result = xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, [0]);
var_dump($result);
?>
Warning: xml_parser_set_option() expects parameter 3 to be int, array given
bool(false)
Использование освобожденного парсера
<?php
$parser = xml_parser_create();
xml_parser_free($parser);
// Попытка использования после освобождения
$result = xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
var_dump($result);
?>
Warning: xml_parser_set_option() expects parameter 1 to be resource, null given
bool(false)
Изменения в версиях PHP
PHP 8.0.0

Параметр parser теперь ожидает объект XMLParser вместо ресурса. Функция возвращает true/false вместо int в предыдущих версиях.

PHP 7.3.0

Добавлена поддержка опции XML_OPTION_SKIP_TAGSTART и XML_OPTION_SKIP_WHITE.

PHP 5.2.0

Добавлена поддержка опции XML_OPTION_TARGET_ENCODING для установки кодировки.

Расширенные примеры
Парсинг с разными кодировками
Пример php
<?php
// Обработка документа в Windows-1251
$parser = xml_parser_create('Windows-1251');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

function startTag($parser, $name, $attrs) {
    echo "Начало тега: $name\n";
    foreach ($attrs as $key => $value) {
        echo "  Атрибут: $key = $value\n";
    }
}

xml_set_element_handler($parser, "startTag", null);
$xml_data = iconv('UTF-8', 'Windows-1251', '<Документ версия="1.0"><Элемент>тест</Элемент></Документ>');
xml_parse($parser, $xml_data, true);
xml_parser_free($parser);
?>
Начало тега: Документ
  Атрибут: версия = 1.0
Начало тега: Элемент
Обработка CDATA-секций
Пример php
<?php
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

function defaultHandler($parser, $data) {
    if (trim($data) !== '') {
        echo "Общие данные: " . htmlspecialchars($data) . "\n";
    }
}

xml_set_default_handler($parser, "defaultHandler");
xml_parse($parser, '<root><![CDATA[<test>content</test>]]></root>', true);
xml_parser_free($parser);
?>
Общие данные: <test>content</test>
Пропуск начала имен тегов
Пример php
<?php
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_TAGSTART, 2);

function startHandler($parser, $name, $attrs) {
    echo "Тег без первых 2 символов: $name\n";
}

xml_set_element_handler($parser, "startHandler", null);
xml_parse($parser, '<TestTag attr="value">content</TestTag>', true);
xml_parser_free($parser);
?>
Тег без первых 2 символов: stTag
Комбинирование нескольких опций
Пример php
<?php
$parser = xml_parser_create();
// Установка всех доступных опций
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_TAGSTART, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");

// Проверка установленных значений
foreach ([XML_OPTION_CASE_FOLDING, XML_OPTION_SKIP_TAGSTART, 
          XML_OPTION_SKIP_WHITE, XML_OPTION_TARGET_ENCODING] as $opt) {
    $val = xml_parser_get_option($parser, $opt);
    echo "Опция $opt: ";
    var_dump($val);
}

xml_parser_free($parser);
?>
Опция 1: int(0)
Опция 3: int(0)
Опция 4: int(1)
Опция 2: string(5) "UTF-8"

PHP xml_parser_set_option function comments

En
Xml parser set option Set options in an XML parser