Xml parser set option: примеры (PHP)
xml_parser_set_option(resource parser, int option, mixed value): boolФункция xml_parser_set_option() изменяет параметры XML-парсера, созданного функцией xml_parser_create(). Эта функция используется при обработке XML-документов с помощью событийного парсера Expat, когда требуется изменить стандартное поведение парсера.
Функция принимает три параметра:
- parser - ресурс XML-парсера
- option - константа, определяющая изменяемую опцию:
- XML_OPTION_CASE_FOLDING (int) - включает или отключает приведение имен тегов к верхнему регистру (по умолчанию включено)
- XML_OPTION_SKIP_TAGSTART (int) - количество символов, которые нужно пропустить от начала имени тега
- XML_OPTION_SKIP_WHITE (int) - пропускать ли пробельные символы (1 - да, 0 - нет)
- XML_OPTION_TARGET_ENCODING (string) - устанавливает целевую кодировку для парсера
- 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);
?>Данные: 'текст'
Класс XMLReader предоставляет последовательное чтение XML-документов, менее требователен к памяти чем DOM. Предпочтительнее для обработки больших файлов.
Простой интерфейс для работы с XML-документами, преобразует XML в объекты. Удобен для чтения и изменения небольших XML-структур.
Полная реализация DOM для PHP, позволяет манипулировать XML-документами как деревом узлов. Подходит для сложных операций с XML-структурами.
Функция для получения текущих значений опций XML-парсера. Используется вместе с xml_parser_set_option для проверки установленных параметров.
import xml.parsers.expat
parser = xml.parsers.expat.ParserCreate()
parser.buffer_text = True # Аналог управления буферизацией
# В Python нет прямой аналогии XML_OPTION_CASE_FOLDING
# Обработка регистра осуществляется через другие механизмыconst parser = new DOMParser();
const xmlDoc = parser.parseFromString('<root><item>test</item></root>', 'text/xml');
// В JavaScript настройки парсера ограничены
// Нет аналогов опциям Expat-парсера PHPSELECT ExtractValue('<root><a>текст</a></root>', '/root/a');
-- MySQL использует XPath для извлечения данных из XML
-- Нет прямого аналога пошагового парсинга<?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)
Параметр parser теперь ожидает объект XMLParser вместо ресурса. Функция возвращает true/false вместо int в предыдущих версиях.
Добавлена поддержка опции XML_OPTION_SKIP_TAGSTART и XML_OPTION_SKIP_WHITE.
Добавлена поддержка опции XML_OPTION_TARGET_ENCODING для установки кодировки.
<?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 Начало тега: Элемент
<?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
$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
$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"