Xml error string: примеры (PHP)
xml_error_string(int error_code): string|falseФункция 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 = 'User Admin '; // Незакрыт тег
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 существуют иные подходы к обработке 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 8 значительных изменений в работе функции xml_error_string() не было. Расширение XML Parser осталось стабильным. Однако, начиная с PHP 8.0, некоторые устаревшие функции XML-расширений могли быть удалены, но xml_error_string() продолжает работать. Рекомендуется сверяться с официальной документацией при переходе между мажорными версиями.
Пример 1: Создание детального обработчика ошибок с сохранением в лог.
<?
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: Сопоставление всех возможных кодов ошибок с их описаниями.
<?
$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: Интеграция с пользовательским обработчиком ошибок для многоязычных сообщений.
<?
$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);
?>Ошибка: Несовпадающий тег