تابع xml_parser_create() در PHP
در PHP، تابع xml_parser_create() ابزار پایهای برای پردازش رویدادی (event-driven) فایلهای XML است. این تابع یک پارسر سبک (SAX-like) ایجاد میکند که با استفاده از هندلرها (callback handlers) میتوان عناصر، دادههای متنی، خطاها و فضاهای نام را به صورت جریانی پردازش کرد. برخلاف DOM که کل سند را در حافظه بار میکند، xml_parser_create مناسب فایلهای بزرگ و پردازش خط به خط است.
چرا از xml_parser_create استفاده کنیم؟
- مصرف حافظه پایینتر برای اسناد بزرگ.
- امکان واکنش آنی به شروع/پایان تگها و دادههای متنی.
- قابلیت کنترل دقیق بر خطاها و موقعیت آنها (شماره خط و ستون).
- هماهنگی با سیستمهایی که فقط به بخشی از اطلاعات نیاز دارند (مانند استخراج فیلدهای خاص).
ایجاد و پیکربندی پارسر
تابع ساده است:
$parser = xml_parser_create();این خط یک منبع پارسر برمیگرداند. برای پشتیبانی از namespace میتوان از xml_parser_create_ns() استفاده کرد که پارامتر جداکننده فضای نام را میگیرد.
تنظیمات مهم
- XML_OPTION_CASE_FOLDING — تبدیل خودکار نام تگها به حروف بزرگ (پیشفرض روشن). با مقدار 0 حالت حساس به حروف را فعال کنید.
- XML_OPTION_SKIP_TAGSTART — مربوط به نرمالسازی موقعیت ستون.
- XML_OPTION_TARGET_ENCODING — مشخص کردن انکودینگ خروجی مانند “UTF-8”.
نمونه ساده: خواندن XML از رشته
<?php
$xml = '' .
'PHP Guide';
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
$elements = [];
$current = null;
xml_set_element_handler($parser,
function($parser, $name, $attrs) use (&$elements, &$current) {
$current = ['name' => $name, 'attrs' => $attrs, 'data' => ''];
},
function($parser, $name) use (&$elements, &$current) {
$elements[] = $current;
$current = null;
}
);
xml_set_character_data_handler($parser, function($parser, $data) use (&$current) {
if ($current !== null) $current['data'] .= $data;
});
if (!xml_parse($parser, $xml, true)) {
$err = xml_error_string(xml_get_error_code($parser));
$line = xml_get_current_line_number($parser);
echo "XML Error: $err at line $linen";
}
xml_parser_free($parser);
print_r($elements);
?>توضیح: این کد یک رشته XML را پارس میکند. ابتدا پارسر ساخته و گزینهٔ عدم تغییر حروف (case folding) فعال شده. دو هندلر برای شروع/پایان عنصر و یک هندلر برای دادههای متنی تعریف شدهاند. در پایان با xml_parse داده پردازش میشود و اگر خطایی باشد با xml_error_string و xml_get_current_line_number گزارش میشود. در پایان منبع پارسر با xml_parser_free آزاد میشود.
گزارش خطا و اشکالزدایی
توصیه میشود در هنگام پردازش XML همیشه بررسی خطا انجام دهید. توابع مفید:
| تابع | کاربرد |
|---|---|
| xml_get_error_code() | گرفتن کد خطا |
| xml_error_string() | تبدیل کد به پیام قابلخواندن |
| xml_get_current_line_number() | شمارهٔ خط فعلی |
| xml_get_current_column_number() | ستون فعلی |
نکات و بهترین شیوهها (Best Practices)
- اگر نیاز به کل درخت سند دارید، از DOM استفاده کنید؛ xml_parser_create برای پردازش جریانی مناسبتر است.
- برای XMLهایی با namespace از
xml_parser_create_ns()استفاده کنید تا namespaceها جدا شوند. - همیشه
xml_parser_free()را فراخوانی کنید تا منابع سیستم آزاد شوند. - برای کار با encodings مختلف از
XML_OPTION_TARGET_ENCODINGاستفاده کنید و اطمینان حاصل کنید که دادهها با انکودینگ صحیح ارسال میشوند. - برای عملکرد بهتر و جلوگیری از مصرف زیاد حافظه در فایلهای بزرگ، از خواندن بلوکی و پارس مرحلهای استفاده کنید.
توابع مرتبط
xml_parse_into_struct()— تبدیل کامل سند به آرایه ساختاری (مناسب برای اسناد متوسط).xml_set_element_handler()— ثبت هندلرهای شروع و پایان عنصر.xml_set_character_data_handler()— هندلر دادههای متنی.xml_parser_set_option()— تنظیم گزینهها.
جمعبندی
تابع xml_parser_create() در PHP ابزار قدرتمند و انعطافپذیری برای پردازش رویدادی XML فراهم میکند. برای اسناد بزرگ یا سناریوهایی که نیاز به پردازش خط به خط دارند، انتخاب مناسبی است. با تعریف مناسب هندلرها، مدیریت خطا و پیکربندی گزینهها میتوانید پردازش XML قابلاطمینان و کارآمدی پیادهسازی کنید.
آیا این مطلب برای شما مفید بود ؟



