ویژگی تصویر

تابع xml_parser_create() در PHP

  /  PHP   /  تابع xml_parser_create() در PHP
بنر تبلیغاتی الف
آموزش 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 قابل‌اطمینان و کارآمدی پیاده‌سازی کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: