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

Функция xml_parser_get_option в PHP 8: полный обзор
Раздел: XML
xml_parser_get_option(resource parser, int option): mixed

Описание функции xml_parser_get_option

Функция xml_parser_get_option() в PHP возвращает текущее значение указанной настройки для XML-парсера. Эта функция применяется для получения параметров конфигурации парсера во время его работы, что позволяет динамически проверять его состояние. Она используется в процессах разбора XML-данных, когда необходимо учитывать или изменять поведение парсера.

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

Функция принимает два обязательных аргумента:

  1. parser (ресурс) – идентификатор XML-парсера, созданный с помощью xml_parser_create().
  2. option (целое число) – константа, определяющая запрашиваемую опцию. Допустимые значения:
    • XML_OPTION_CASE_FOLDING (по умолчанию 1) – включает или отключает преобразование тегов в верхний регистр. Возвращает 1 (включено) или 0 (выключено).
    • XML_OPTION_SKIP_TAGSTART (по умолчанию 0) – возвращает количество символов, пропускаемых с начала имени тега.
    • XML_OPTION_SKIP_WHITE (по умолчанию 0) – включает или отключает пропуск пробельных символов. Возвращает 1 (включено) или 0 (выключено).
    • XML_OPTION_TARGET_ENCODING (по умолчанию зависит от парсера) – возвращает текущую целевую кодировку для парсера в виде строки (например, "UTF-8").

В случае ошибки функция возвращает false (например, при неверном идентификаторе парсера или неизвестной опции).

Короткие примеры использования

Получение состояния преобразования регистра
<?php
$parser = xml_parser_create();
$caseFolding = xml_parser_get_option($parser, XML_OPTION_CASE_FOLDING);
echo "XML_OPTION_CASE_FOLDING: $caseFolding";
xml_parser_free($parser);
?>
XML_OPTION_CASE_FOLDING: 1
Проверка целевой кодировки
<?php
$parser = xml_parser_create('ISO-8859-1');
$encoding = xml_parser_get_option($parser, XML_OPTION_TARGET_ENCODING);
echo "Кодировка: $encoding";
xml_parser_free($parser);
?>
Кодировка: ISO-8859-1
Обработка несуществующей опции
<?php
$parser = xml_parser_create();
$result = xml_parser_get_option($parser, 999); // Несуществующая опция
var_dump($result);
xml_parser_free($parser);
?>
bool(false)

Похожие функции в PHP

Для работы с XML-парсером в PHP существуют другие функции, которые часто используются вместе с xml_parser_get_option():

  • xml_parser_set_option() – устанавливает значение опции для парсера. Предпочтительнее использовать для динамического изменения настроек во время разбора.
  • xml_parser_create() – создаёт новый XML-парсер. Без неё невозможно использовать функции получения или установки опций.
  • xml_parse() – начинает разбор XML-документа. Функции управления опциями обычно вызываются до или между вызовами xml_parse().
  • xml_parser_free() – освобождает ресурсы парсера. Важно использовать после завершения работы.

Если требуется более высокоуровневая работа с XML, рекомендуется использовать расширения DOMDocument или SimpleXML, которые предоставляют объектно-ориентированный интерфейс.

Альтернативы в других языках

Python: xml.parsers.expat

В языке Python модуль xml.parsers.expat предоставляет похожий низкоуровневый интерфейс. Аналогом получения опции является чтение атрибутов объекта парсера.

import xml.parsers.expat
parser = xml.parsers.expat.ParserCreate()
print("Обработка пространств имен:", parser.ProcessNamespaces)
parser.ProcessNamespaces = True
print("Новое значение:", parser.ProcessNamespaces)
Обработка пространств имен: 0
Новое значение: True
JavaScript: DOMParser

В JavaScript используется высокоуровневый DOMParser для разбора XML. Прямого аналога функции получения опций нет, так как настройки определяются при создании объекта.

const parser = new DOMParser();
const xmlDoc = parser.parseFromString('<root></root>', 'text/xml');
console.log(xmlDoc.documentElement.nodeName); // Проверка результата
"root"
MySQL: функции для работы с XML

В СУБД MySQL существуют функции для извлечения данных из XML, например, ExtractValue(). Они ориентированы на запросы, а не на настройку парсера.

SELECT ExtractValue('<book><title>PHP Guide</title></book>', '/book/title') AS title;
title
PHP Guide

Типичные ошибки при использовании

Передача неверного идентификатора парсера

Если в качестве первого аргумента передан не ресурс парсера, функция вернёт false и может вызвать предупреждение.

<?php
$result = xml_parser_get_option(null, XML_OPTION_CASE_FOLDING);
var_dump($result);
?>
Warning: xml_parser_get_option(): supplied argument is not a valid XML Parser resource in ...
bool(false)
Использование после освобождения ресурсов

Попытка получить опцию после вызова xml_parser_free() приводит к ошибке, так как парсер больше не существует.

<?php
$parser = xml_parser_create();
xml_parser_free($parser);
$option = xml_parser_get_option($parser, XML_OPTION_CASE_FOLDING);
?>
Warning: xml_parser_get_option(): supplied argument is not a valid XML Parser resource in ...
Некорректная константа опции

Если вторая константа не существует, функция также вернёт false.

<?php
$parser = xml_parser_create();
$option = xml_parser_get_option($parser, 100);
var_dump($option);
xml_parser_free($parser);
?>
bool(false)

Изменения в последних версиях PHP

В PHP 8.0.0 функция xml_parser_get_option() претерпела следующие изменения:

  • Тип возвращаемого значения теперь объявлен как mixed. Ранее документация не уточняла тип.
  • Параметр parser теперь ожидает ресурс (XML Parser). В предыдущих версиях принимался ресурс любого типа, что могло приводить к неочевидным ошибкам.
  • Усилена строгость типов: передача некорректного типа аргумента может вызвать исключение TypeError в некоторых режимах.

Рекомендуется обновлять код для совместимости с PHP 8, проверяя типы аргументов и возвращаемых значений.

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

Динамическое переключение опций во время разбора

Пример демонстрирует, как можно изменить опцию пропуска пробелов в зависимости от содержимого XML.

Пример php
<?php
function startElement($parser, $name, $attrs) {
    // Включаем пропуск пробелов для определенных тегов
    if ($name === 'DATA') {
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        echo "Пропуск пробелов включен\n";
    }
    $skipWhite = xml_parser_get_option($parser, XML_OPTION_SKIP_WHITE);
    echo "Тег: $name, SKIP_WHITE: $skipWhite\n";
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", null);
$xml = '<root><DATA>   текст   </DATA><INFO>текст</INFO></root>';
xml_parse($parser, $xml);
xml_parser_free($parser);
?>
Тег: ROOT, SKIP_WHITE: 0
Пропуск пробелов включен
Тег: DATA, SKIP_WHITE: 1
Тег: INFO, SKIP_WHITE: 1
Мониторинг кодировки в многопоточном окружении

В сценариях, где один парсер может использоваться для разных источников, полезно проверять кодировку перед разбором.

Пример php
<?php
function parseXmlWithEncodingCheck($xmlString, $expectedEncoding = 'UTF-8') {
    $parser = xml_parser_create();
    $currentEncoding = xml_parser_get_option($parser, XML_OPTION_TARGET_ENCODING);
    if ($currentEncoding !== $expectedEncoding) {
        xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $expectedEncoding);
        echo "Кодировка изменена с $currentEncoding на $expectedEncoding\n";
    }
    // ... дальнейший разбор ...
    xml_parser_free($parser);
}
parseXmlWithEncodingCheck('<test/>', 'UTF-8');
?>
Кодировка изменена с ISO-8859-1 на UTF-8
Сброс опций к значениям по умолчанию

Иногда требуется восстановить исходные настройки парсера. Для этого можно сохранить значения всех опций перед изменением.

Пример php
<?php
$parser = xml_parser_create();
$defaults = [
    'case_folding' => xml_parser_get_option($parser, XML_OPTION_CASE_FOLDING),
    'skip_white' => xml_parser_get_option($parser, XML_OPTION_SKIP_WHITE)
];
// ... изменения опций ...
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
// Восстановление
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, $defaults['case_folding']);
echo "Восстановлено CASE_FOLDING: " . xml_parser_get_option($parser, XML_OPTION_CASE_FOLDING);
xml_parser_free($parser);
?>
Восстановлено CASE_FOLDING: 1

PHP xml_parser_get_option function comments

En
Xml parser get option Get options from an XML parser