تابع xml_error_string() در PHP
تابع xml_error_string() در PHP یک ابزار ساده اما مفید برای تبدیل کدهای خطای تحلیلگر XML (XML Parser / Expat) به پیغامهای قابل خواندن توسط انسان است. زمانی که با API قدیمی XML Parser (توابع xml_*) کار میکنید و خطایی هنگام پارس کردن XML رخ میدهد، این تابع به شما کمک میکند تا پیام خطا را نمایش دهید و موقعیت خطا را بهتر تشخیص دهید.
امضای تابع و مقدار بازگشتی
امضای تابع به صورت زیر است:
string xml_error_string ( int $error_code )این تابع یک رشته شامل توضیح خطا را برمیگرداند که متن آن بر اساس کد عددی خطا تعیین میشود. برای بهدست آوردن کد خطا از توابعی مانند xml_get_error_code() استفاده میشود.
چرا و کی باید از xml_error_string() استفاده کنیم؟
- وقتی از API مبتنی بر expat (توابع xml_parser_create، xml_parse و غیره) استفاده میکنید.
- برای نمایش پیغام خطای قابلفهم به توسعهدهندگان یا لاگها بهجای نمایش تنها یک عدد.
- زمانی که نیاز دارید علاوه بر خطا، شماره خط و ستون خطا را نیز نشان دهید تا رفع اشکال سادهتر شود.
مثال عملی: پارس کردن XML و گرفتن پیام خطا
<?php
$xml = "<root><item>Hello</root>"; // ساختار اشتباه: تگ item بسته نشده
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
$code = xml_get_error_code($parser);
$message = xml_error_string($code);
$line = xml_get_current_line_number($parser);
$col = xml_get_current_column_number($parser);
echo "XML Error: $message (code: $code) at line $line, column $coln";
}
xml_parser_free($parser);
?>توضیح: در این مثال ابتدا یک رشته XML ناقص ساختهایم. سپس با xml_parser_create() یک پارسکننده ایجاد میکنیم و xml_parse() را اجرا میکنیم. در صورت خطا، با xml_get_error_code() کد خطا را میگیریم و با xml_error_string() آن را به پیام قابل خواندن تبدیل میکنیم. همچنین شماره خط و ستون خطا را با توابع مربوطه استخراج و نمایش میدهیم. در پایان حافظه پارسر با xml_parser_free() آزاد میشود.
نکات فنی و بهترین روشها
- تابع xml_error_string() فقط برای کدهای متعلق به XML Parser (expat) معتبر است؛ اگر از DOMDocument یا SimpleXML استفاده میکنید، بهتر است از libxml_get_errors() و libxml_use_internal_errors() استفاده کنید.
- همیشه قبل از فراخوانی xml_get_error_code() و xml_error_string() از اینکه پارسر هنوز آزاد نشده یا از بین نرفته مطمئن شوید.
- برای لاگکردن خطا، بهتر است علاوه بر پیام خطا، کد عددی و موقعیت (line/column) را هم ثبت کنید تا تحلیل بعدی آسانتر شود.
مثال پیشرفته: تابع کمکی برای گزارش کامل خطا
<?php
function xml_parse_with_errors($xml) {
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
$code = xml_get_error_code($parser);
$message = xml_error_string($code);
$line = xml_get_current_line_number($parser);
$col = xml_get_current_column_number($parser);
xml_parser_free($parser);
return [
'ok' => false,
'code' => $code,
'message' => $message,
'line' => $line,
'column' => $col,
];
}
xml_parser_free($parser);
return ['ok' => true];
}توضیح: این تابع یک لایهی کمکی ایجاد میکند که خروجییافته و ساختاریافتهای از نتیجهی پارسینگ را برمیگرداند. اگر خطا باشد، اطلاعات مفیدی شامل کد و پیام خطا و محل وقوع را در آرایه بازمیگرداند؛ در غیر اینصورت نتیجه موفق را برمیگرداند. این الگو برای لاگینگ و نمایش در ابزارهای دیباگ مفید است.
نمونهای از پیامها و کدهای رایج
| ثابت | توضیح کلی |
|---|---|
| XML_ERROR_NONE | بدون خطا |
| XML_ERROR_NO_MEMORY | عدم وجود حافظه کافی |
| XML_ERROR_SYNTAX | خطای نحو (Syntax error) |
| XML_ERROR_NO_ELEMENTS | هیچ المانی در مستند وجود ندارد |
| XML_ERROR_TAG_MISMATCH | عدم تطابق تگها (tag mismatch) |
| XML_ERROR_DUPLICATE_ATTRIBUTE | صفت تکراری در یک المان |
| XML_ERROR_UNKNOWN_ENCODING | کدگذاری ناشناخته |
توجه: این فهرست کامل نیست؛ اما شامل کدهای متداولی است که هنگام پارس XML اشتباه معمولاً با آنها مواجه میشوید. استفاده از xml_error_string() کمک میکند این کدها را به پیامهای قابلفهم تبدیل کنید.
مقایسه با روشهای مدرنتر
رویکردهای مدرن مانند DOMDocument یا SimpleXML معمولاً تجربه توسعهای راحتتری فراهم میکنند و خطاها را از طریق libxml مدیریت میکنند. اگر از این روشها استفاده میکنید، توصیه میشود از libxml_use_internal_errors(true) و سپس libxml_get_errors() برای دریافت جزئیات استفاده کنید. اما در پروژههایی که هنوز توابع xml_* را مصرف میکنند یا برای پردازش مبتنی بر جریان (stream) به پارسر expat نیاز دارند، xml_error_string() ابزار مناسب و لازم است.
جمعبندی و نکات پایانی
- xml_error_string() یک ابزار ساده و مستقیم برای ترجمه کدهای خطای XML Parser به متن انسانی است.
- برای تشخیص دقیق محل خطا از توابع xml_get_current_line_number و xml_get_current_column_number نیز استفاده کنید.
- در صورت امکان از APIهای جدیدتر (DOM/SimpleXML) استفاده کنید؛ اما وقتی با expat کار میکنید، xml_error_string() را فراموش نکنید.
آیا این مطلب برای شما مفید بود ؟



