تابع xml_parse_into_struct() در PHP
تابع xml_parse_into_struct() یکی از توابع استاندارد PHP برای تبدیل یک رشته XML (یا بخشی از آن) به آرایهای ساختیافته است. این تابع به صورت یک پارسر DOM-مانند عمل نمیکند بلکه با سبک SAX، محتوا را به مجموعهای از رکوردها (nodes) تجزیه کرده و اطلاعات تگها، مقدارها، سطح (level) و صفات را در آرایهای بازمیگرداند. این روش برای پردازش سریع و ساده XMLهای کوچک تا متوسط بسیار کاربردی است.
امضاء و پارامترها
- xml_parse_into_struct(resource $parser, string $data, array &$values [, array &$index ]) : int|false
- $parser: شناسه یک parser تولیدشده توسط xml_parser_create() یا xml_parser_create_ns().
- $data: رشته XML یا بخشی از آن.
- $values: ارجاع به آرایهای که خروجی پارس در آن قرار میگیرد.
- $index (اختیاری): ارجاع به آرایهای که ایندکس یا نگاشت تگها به اندیسهای آرایه $values را میسازد.
خلاصه خروجی
| کلید | توضیح |
|---|---|
| tag | نام تگ (به صورت پیشفرض با حروف بزرگ برمیگردد مگر XML_OPTION_CASE_FOLDING غیرفعال شود) |
| type | نوع رکورد: “open”, “close”, “complete”, یا “cdata” |
| level | عمق (سطح) تگ در ساختار XML |
| attributes | آرایه صفات در صورت وجود |
| value | متن داخل تگ (در صورت وجود) |
مثال پایه: تبدیل XML به آرایه
<?php
$xml = <<<XMLAliFatemeh
XML;
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // حفظ حالت حروف تگها
if (!xml_parse_into_struct($parser, $xml, $values, $index)) {
$err = xml_get_error_code($parser);
echo "XML parse error: " . xml_error_string($err) . " at line " . xml_get_current_line_number($parser);
} else {
var_dump($values);
var_dump($index);
}
xml_parser_free($parser);
?>در این مثال، ابتدا پارسر ایجاد شده و گزینه XML_OPTION_CASE_FOLDING غیرفعال میشود تا نام تگها دقیقاً همانطور که در XML آمده حفظ شوند. سپس با xml_parse_into_struct، محتوا به آرایه $values تبدیل و نگاشت تگها در $index قرار میگیرد. اگر خطایی رخ دهد با xml_get_error_code و xml_error_string اطلاعات خطا گزارش میشود. در پایان با xml_parser_free مدیریت حافظه انجام میشود.
توضیح خروجی و کاربرد $index
آرایه $values به صورت متوالی شامل رکوردهایی است که نوع آنها میتواند “open” (شروع تگ)، “complete” (تگ بدون محتوای جداگانه)، “close” (پایان تگ) یا “cdata” باشد. آرایه $index برای هر تگ لیستی از اندیسهای مربوطه در $values را نگه میدارد، که برای جستجوی سریع کاربرد دارد.
نکات کاربردی، محدودیتها و پیشنهادات بهینهسازی
- XML_OPTION_CASE_FOLDING: به صورت پیشفرض PHP نام تگها را به حروف بزرگ تبدیل میکند. اگر نیاز دارید نامها حساس به کوچک/بزرگ باشند، مقدار این گزینه را صفر کنید.
- حافظه: xml_parse_into_struct کل XML را در حافظه پردازش میکند؛ برای فایلهای بسیار بزرگ بهتر است از XMLReader یا رویکرد SAX استفاده کنید تا به صورت stream پردازش انجام شود.
- فضای نامها (namespaces): اگر XML دارای namespace است، از xml_parser_create_ns() برای ایجاد پارسر با پشتیبانی namespace استفاده کنید.
- اعتبارسنجی: این تابع صرفاً پارس میکند و اعتبارسنجی DTD/XSD انجام نمیدهد.
- خطاها: در صورت بروز خطا از xml_get_error_code و xml_error_string و xml_get_current_line_number برای تشخیص خطا استفاده کنید.
مثال پیشرفته: استفاده از xml_parser_create_ns برای namespace
<?php
$xml = 'Value';
$parser = xml_parser_create_ns('UTF-8', ':'); // ':' بهعنوان جداکننده فضانامها
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($parser, $xml, $values, $index);
var_dump($values);
xml_parser_free($parser);
?>با xml_parser_create_ns میتوان جداکنندهی URI namespace را مشخص کرد. در خروجی تگها شکل “namespaceURI:localname” یا با جداکنندهای که تعیین کردهاید قابل مشاهده است که به مدیریت فضاهای نام کمک میکند.
مقایسه با روشهای دیگر
- SimpleXML: برای XMLهای کوچک و برای تبدیل مستقیم به اشیاء ساده کاربردی و خواناتر است.
- XMLReader: مناسب برای پردازش بهصورت stream و فایلهای بزرگ، مصرف حافظه پایینتر دارد.
- DOMDocument: برای نیاز به دستکاری ساختاری درختی (ویرایش، اضافه/حذف نودها) مناسب است.
چه زمانی xml_parse_into_struct مناسب است؟
اگر نیاز دارید تا سریعاً یک XML کوچک یا متوسط را به مجموعهای از رکوردها تبدیل کنید و با ایندکس بر اساس تگها کار کنید (مثلاً استخراج مقادیر متعدد از تگهای مشابه)، این تابع گزینهای مناسب و سریع است. اگر نیاز به پردازش خط به خط یا فایلهای بزرگ دارید، سراغ XMLReader بروید.
جمعبندی و توصیهها
xml_parse_into_struct() ابزاری قدرتمند برای تبدیل XML به آرایهای ساختیافته با اطلاعات سطح، نوع، صفات و مقدار است. با رعایت نکاتی مثل مدیریت case folding، آزادسازی پارسر، و محدودیتهای حافظه میتوانید از آن بهصورت مؤثر استفاده کنید. برای XMLهای سنگین یا نیاز به پردازش تدریجی، استفاده از XMLReader یا راهکارهای مبتنی بر stream پیشنهاد میشود.
آیا این مطلب برای شما مفید بود ؟



