handler پیش فرض (xml_set_default_handler)
با «هندلر پیش فرض (Default Handler)» آشنا می شویم. پارسر (Parser) وقتی هر داده ای ببیند، این هندلر را صدا می زند. بنابراین می توانیم متن خام XML را دریافت کنیم. تابع xml_set_default_handler() این اتصال را انجام می دهد.
xml_set_default_handler چیست؟
این تابع تعیین می کند کدام «هندلر (Handler)» برای هر داده صدا شود. منظور از داده، متن هایی است که بین تگ ها دیده می شود. بنابراین با یک تابع ساده می توانیم متن را چاپ یا پردازش کنیم.
گام های عملی سریع
- یک پارسر با
xml_parser_create()بساز. - یک تابع با ورودی های
$parserو$dataبنویس. - هندلر پیش فرض را ثبت کن.
- فایل XML را بخوان و با
xml_parse()پردازش کن.
<?php
$parser = xml_parser_create();
function def_handler($parser, $data) {
echo $data;
}
xml_set_default_handler($parser, "def_handler");
$fp = fopen("note.xml", "r");
while ($chunk = fread($fp, 4096)) {
$done = feof($fp);
$ok = xml_parse($parser, $chunk, $done);
if (!$ok) {
$msg = sprintf(
"XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)
);
die($msg);
}
}
xml_parser_free($parser);
fclose($fp);
نکته: آرگومان handler می تواند آرایه باشد؛ یعنی شیء و نام متد.
نمونه شیءگرا با آرایه [object, method]
<?php
class Reader {
public function onAny($parser, $data) {
echo trim($data);
}
}
$parser = xml_parser_create();
$reader = new Reader();
xml_set_default_handler($parser, [$reader, "onAny"]);
$xml = "<note>Hi</note>";
$ok = xml_parse($parser, $xml, true);
if (!$ok) {
$msg = xml_error_string(xml_get_error_code($parser));
$line = xml_get_current_line_number($parser);
die($msg . " at line " . $line);
}
xml_parser_free($parser);
پارامترها و مقدار بازگشتی
- parser: نمونه پارسر XML که داده را می خواند.
- handler: نام تابع یا آرایه شیء و متد.
- بازگشت: موفقیت
TRUEو در خطاFALSE.
هشدار: تابع هندلر باید دقیقاً دو ورودی داشته باشد: $parser و $data.
اشتباهات رایج و ترفندها
- چاپ فاصله های اضافه: از
trim()کمک بگیر. - فراموشی آزادسازی:
xml_parser_free()را حتماً صدا بزن. - دیباگ آسان تر: پیام و شماره خط را چاپ کن.
مطالعه بیشتر
راهنمای شروع XML در PHP: آموزش XML در PHP. همچنین درباره «هندلر داده کاراکتری» این صفحه را ببین: هندلر داده کاراکتری XML.
جمع بندی سریع
- برای هر داده XML صدا می خورد.
- دو ورودی لازم دارد: پارسر و داده.
- می تواند شیء و متد بگیرد.
- در موفقیت TRUE وگرنه FALSE.
- پس ازکار پارسر را آزاد کن.