Xml error string: примеры (PHP)

Работа с xml_error_string: обработка ошибок парсера XML
Раздел: XML
xml_error_string(int error_code): string|false
Описание функции xml_error_string

Функция xml_error_string() является частью расширения XML Parser в PHP. Она используется для получения текстового описания ошибки по её числовому коду, который генерируется в процессе разбора XML-документа.

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

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

  • int $error_code (обязательный) — целочисленный код ошибки, возвращаемый функцией xml_get_error_code().

Возвращаемое значение: строка (string) с текстовым описанием ошибки или null, если переданный код не соответствует известным ошибкам.

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

Пример 1: Получение описания для конкретного кода ошибки.

<?
$errorCode = 2; // XML_ERROR_NO_MEMORY
echo xml_error_string($errorCode);
?>
No memory

Пример 2: Использование в связке с xml_get_error_code при парсинге.

<?
$parser = xml_parser_create();
$xml = 'UserAdmin'; // Незакрыт тег 

if (!xml_parse($parser, $xml, true)) {
    $errorCode = xml_get_error_code($parser);
    $errorString = xml_error_string($errorCode);
    echo "Ошибка ($errorCode): $errorString";
}
xml_parser_free($parser);
?>
Ошибка (76): Mismatched tag

Пример 3: Передача несуществующего кода ошибки.

<?
$result = xml_error_string(9999);
var_dump($result);
?>
NULL
Похожие функции в PHP

В PHP существуют иные подходы к обработке XML, которые могут включать собственную систему сообщений об ошибках:

  • libxml_get_errors() и libxml_get_last_error() — функции расширения libxml, используемого в DOMDocument и SimpleXML. Они возвращают массив объектов LibXMLError с детальной информацией, включая сообщение, код, строку и столбец. Предпочтительнее для объектно-ориентированного подхода и когда требуется больше контекста об ошибке.
  • XMLReader::getParserProperty() и обработка через исключения — при использовании класса XMLReader ошибки часто контролируются через свойства или механизм исключений. Этот метод лучше подходит для потокового чтения больших XML-файлов.

Функция xml_error_string() используется преимущественно с procedural XML Parser, который является более низкоуровневым.

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

Xml error string в Python

В модуле xml.parsers.expat используется класс xmlparser.ErrorString.

import xml.parsers.expat

try:
    parser = xml.parsers.expat.ParserCreate()
    # Имитация ошибки: передача некорректных байтов
    parser.Parse(b'\x00', True)
except xml.parsers.expat.ExpatError as e:
    print(f'Код ошибки: {e.code}')
    print(f'Описание: {xml.parsers.expat.ErrorString(e.code)}')
Код ошибки: 3
Описание: not well-formed (invalid token)

Xml error string в Javascript

В браузерной среде при парсинге XML через DOMParser ошибки доступны через свойства объекта Document или перехватываются исключениями.

let parser = new DOMParser();
let xmlString = ''; // Несбалансированный тег
try {
    let xmlDoc = parser.parseFromString(xmlString, 'text/xml');
    let error = xmlDoc.getElementsByTagName('parsererror');
    if (error.length > 0) {
        console.log(error[0].textContent);
    }
} catch (e) {
    console.log(e.message);
}
XML Parsing Error: mismatched tag...

Xml error string в MySQL

Прямого аналога нет. При работе с XML-функциями MySQL (например, ExtractValue()) ошибки парсинга приводят к возврату NULL или генерации предупреждения, которое можно получить через SHOW WARNINGS.

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

Ошибка 1: Передача кода ошибки до начала парсинга или без инициализации парсера.

<?
// Парсер не создан, код ошибки не получен
$message = xml_error_string(0);
echo $message;
?>
No error

Ошибка 2: Использование кода ошибки из одного парсера для другого, хотя это технически возможно, если коды совпадают, но логически некорректно.

<?
$parser1 = xml_parser_create();
$parser2 = xml_parser_create();
$xml = '';
xml_parse($parser1, $xml, true);
$code = xml_get_error_code($parser1);
// Использование кода от parser1 для получения строки (работает)
$string = xml_error_string($code);
echo $string;
xml_parser_free($parser1);
xml_parser_free($parser2);
?>
Mismatched tag

Ошибка 3: Неправильная интерпретация возвращаемого значения. Функция возвращает описание только для известных кодов ошибок XML Parser, а не для любых числовых значений.

Изменения в версиях PHP

В PHP 8 значительных изменений в работе функции xml_error_string() не было. Расширение XML Parser осталось стабильным. Однако, начиная с PHP 8.0, некоторые устаревшие функции XML-расширений могли быть удалены, но xml_error_string() продолжает работать. Рекомендуется сверяться с официальной документацией при переходе между мажорными версиями.

Расширенные примеры

Пример 1: Создание детального обработчика ошибок с сохранением в лог.

Пример php
<?
function parseXMLWithDetailedLog($xmlData) {
    $parser = xml_parser_create();
    xml_set_element_handler($parser, 'startElement', 'endElement');
    
    if (!xml_parse($parser, $xmlData, true)) {
        $code = xml_get_error_code($parser);
        $desc = xml_error_string($code);
        $line = xml_get_current_line_number($parser);
        $column = xml_get_current_column_number($parser);
        $byte = xml_get_current_byte_index($parser);
        
        $logEntry = sprintf(
            'XML Parse Error: %s (Code: %d) at line %d, column %d, byte %d',
            $desc, $code, $line, $column, $byte
        );
        error_log($logEntry);
        // Можно также выбросить исключение
        throw new Exception($logEntry);
    }
    xml_parser_free($parser);
}

function startElement($parser, $name, $attrs) {}
function endElement($parser, $name) {}

try {
    parseXMLWithDetailedLog('');
} catch (Exception $e) {
    echo $e->getMessage();
}
?>
XML Parse Error: Mismatched tag (Code: 76) at line 1, column 21, byte 21

Пример 2: Сопоставление всех возможных кодов ошибок с их описаниями.

Пример php
<?
$errorMap = [];
for ($i = 0; $i <= 100; $i++) {
    $description = xml_error_string($i);
    if ($description !== null) {
        $errorMap[$i] = $description;
    }
}
echo '
' . print_r($errorMap, true) . '
'; ?>
Array
(
    [0] => No error
    [1] => No memory
    [2] => Syntax error
    [3] => No elements
    [4] => Invalid token
    [5] => Unclosed token
    [6] => Partial character
    [7] => Tag mismatch
    [8] => Duplicate attribute
    [9] => Junk after document element
    [10] => Illegal parameter entity reference
    [11] => Undefined entity
    [12] => Recursive entity reference
    [13] => Async entity
    [14] => Bad character reference
    [15] => Binary entity reference
    [16] => Attribute external entity reference
    [17] => Misplaced XML processing instruction
    [18] => Unknown encoding
    [19] => Incorrect encoding
    [20] => Unclosed CDATA section
    [21] => External entity handling error
    [22] => Not well-formed (invalid token)
    [23] => Unclosed token
    [24] => Partial character
    [25] => Standalone value
    [26] => Invalid document structure
    [27] => Invalid decimal character reference
    [28] => Invalid hexadecimal character reference
    [29] => Invalid character reference
    [30] => Invalid character
    [31] => Character reference at EOF
    [32] => Character reference in prolog
    [33] => Character reference in epilog
    [34] => Character reference in DTD
    [35] => Entity reference in prolog
    [36] => Entity reference in epilog
    [37] => Entity reference in DTD
    [38] => External entity reference in attribute
    [39] => Misplaced XML declaration
    [40] => Unknown version
    [41] => Unknown encoding
    [42] => Encoding name mismatch
    [43] => Not standalone
    [44] => Unexpected state
    [45] => Entity reference in attribute value
    [46] => Entity reference in internal subset
    [47] => External entity reference not allowed
    [48] => External entity reference in DTD
    [49] => Invalid UTF-8
    [50] => Invalid UTF-8 in attribute value
    [51] => Invalid UTF-8 in character reference
    [52] => Invalid UTF-8 in internal entity
    [53] => Invalid UTF-8 in external entity
    [54] => Invalid UTF-8 in notation
    [55] => Invalid UTF-8 in processing instruction
    [56] => Invalid UTF-8 in comment
    [57] => Invalid UTF-8 in CDATA section
    [58] => Invalid UTF-8 in text
    [59] => Invalid UTF-8 in attribute
    [60] => Invalid UTF-8 in entity reference
    [61] => Invalid UTF-8 in default attribute value
    [62] => Invalid UTF-8 in external identifier
    [63] => Invalid UTF-8 in public identifier
    [64] => Invalid UTF-8 in system identifier
    [65] => Invalid UTF-8 in notation system identifier
    [66] => Invalid UTF-8 in notation public identifier
    [67] => Invalid UTF-8 in notation
    [68] => Invalid UTF-8 in notation text
    [69] => Invalid UTF-8 in notation attribute
    [70] => Invalid UTF-8 in notation attribute value
    [71] => Invalid UTF-8 in notation attribute default
    [72] => Invalid UTF-8 in notation attribute enumeration
    [73] => Invalid UTF-8 in notation attribute fixed
    [74] => Invalid UTF-8 in notation attribute required
    [75] => Invalid UTF-8 in notation attribute implied
    [76] => Mismatched tag
)

Пример 3: Интеграция с пользовательским обработчиком ошибок для многоязычных сообщений.

Пример php
<?
$russianErrorMessages = [
    2 => 'Синтаксическая ошибка',
    76 => 'Несовпадающий тег',
    // ... другие переводы
];

function getLocalizedXmlError($errorCode, $translations) {
    $defaultMessage = xml_error_string($errorCode);
    return $translations[$errorCode] ?? $defaultMessage;
}

$parser = xml_parser_create();
$xml = '';
if (!xml_parse($parser, $xml, true)) {
    $code = xml_get_error_code($parser);
    echo 'Ошибка: ' . getLocalizedXmlError($code, $russianErrorMessages);
}
xml_parser_free($parser);
?>
Ошибка: Несовпадающий тег

PHP xml_error_string function comments

En
Xml error string Get XML parser error string