متد getDocNamespaces() در PHP
در کار با XML در PHP، مدیریت نامفضاها (namespaces) بخش مهمی از پردازش محتوای XML است. متد getDocNamespaces() متعلق به کلاس SimpleXMLElement یکی از ابزارهای کاربردی برای استخراج نامفضاهای تعریفشده در سند XML است. در این مقاله به صورت دقیق و عملیاتی این متد را معرفی، مثالزنی و نکات حرفهای پیرامون آن را بررسی میکنیم.
چه کاری انجام میدهد؟
متد getDocNamespaces() تمامی نامفضاهایی را که در سند XML تعریف شدهاند بازمیگرداند. نتیجه معمولاً آرایهای است که کلید آن پیشوند (prefix) و مقدار آن آدرس URI نامفضا است. برای نامفضهٔ پیشفرض (بدون prefix) کلید معمولاً رشتهٔ خالی (“”) خواهد بود.
امضای متد و مقدار بازگشتی
| متد | پارامترها | نوع بازگشتی |
|---|---|---|
| SimpleXMLElement::getDocNamespaces() | پارامتر اختیاری: bool $recursive (اغلب true) | array — آرایهای از prefix => namespaceURI |
توجه: در عمل معمولاً متد را با مقدار true فراخوانی میکنند تا نامفضاهای سند به صورت بازگشتی بررسی شود.
مثال پایهای: خواندن نامفضاها
<?php
$xmlString = <<<XML
Hello
World
XML;
$xml = simplexml_load_string($xmlString);
$namespaces = $xml->getDocNamespaces(true);
print_r($namespaces);
?>در مثال بالا، با simplexml_load_string یک شی SimpleXMLElement ساخته شده و سپس getDocNamespaces(true) نامفضاهای سند را استخراج میکند. خروجی print_r چیزی شبیه به این خواهد بود:
Array
(
[] => http://default.example.com
[ns1] => http://example.com/ns1
[ns2] => http://example.com/ns2
)
در این خروجی کلید خالی نشاندهندهٔ نامفضای پیشفرض است و سایر کلیدها پیشوندهای تعریفشده را نمایش میدهند.
چگونه از نامفضاها برای دسترسی به المانها استفاده کنیم؟
بعد از دریافت نامفضاها، معمولاً میخواهیم المانها یا صفتها را درون آن نامفضاها بخوانیم. دو روش رایج وجود دارد: استفاده از children/attributes با URI یا ثبت نامفضا برای XPath.
مثال — دسترسی با children و attributes
$nsUri) {
// دسترسی به فرزندان هر نامفضا از ریشه
foreach ($xml->children($nsUri) as $child) {
echo "Prefix: [$prefix] Element: " . $child->getName() . " Value: " . (string)$child . PHP_EOL;
}
}
?>توضیح: در این کد از نسخهٔ children($namespaceURI) استفاده شده تا تمام فرزندان متعلق به یک نامفضا خوانده شوند. توجه داشته باشید که در children نامفضا را معمولاً با URI میدهیم، نه با prefix.
مثال — استفاده از XPath با registerXPathNamespace
$nsUri) {
// اگر prefix خالی باشد، باید یک prefix دلخواه برای XPath تعریف کنیم
$regPrefix = $prefix === '' ? 'def' : $prefix;
$xml->registerXPathNamespace($regPrefix, $nsUri);
}
// حالا میتوان از XPath با prefixهای ثبتشده استفاده کرد
$items = $xml->xpath('//ns1:item');
foreach ($items as $it) {
echo (string)$it . PHP_EOL;
}
?>توضیح: برای استفاده از XPath روی نامفضای پیشفرض لازم است یک پیشوند مصنوعی ثبت کنیم (مثلاً ‘def’)، چون XPath بهطور مستقیم نامفضهٔ بدون prefix را پشتیبانی نمیکند. سپس میتوانیم از دستورات xpath(‘//prefix:tag’) استفاده کنیم.
نکات حرفهای و موارد مرسوم
- نامفضاهای پیشفرض: کلید “” در آرایه نمایانگر نامفضای پیشفرض است. برای XPath لازم است یک prefix دلخواه به آن اختصاص دهید.
- getDocNamespaces vs getNamespaces: getDocNamespaces نامفضاهای تعریفشده در کل سند را برمیگرداند؛ در حالی که getNamespaces معمولاً نامفضاهای محلی یک عنصر را میدهد (با پارامتر بازگشتی برای بازگشت بازگشتی).
- رسیدگی به تکرارها: اگر سند بزرگ باشد و شما فقط به نامفضای ریشه نیاز دارید، getDocNamespaces(false) (در صورتی که پارامتر پشتیبانی شود) هزینهٔ پردازشی را کاهش میدهد.
- ترکیب با DOM: در مواقعی که نیاز به عملیات پیچیدهتر (مانند تغییر ساختار یا رقابت به کارایی) دارید، تبدیل به DOMDocument و استفاده از DOMXPath گزینهٔ قدرتمندتری است.
بهینهسازی و نکات امنیتی
در پردازش XMLهای ناشناس همیشه مراقب External Entity و حملات مرتبط باشید. اگر XML از منابع نامطمئن میآید، تنظیمات libxml_disable_entity_loader و گزینههای مربوط به SimpleXML را بررسی کنید تا XXE جلوگیری شود.
جمعبندی
متد getDocNamespaces() ابزار ساده و مؤثری برای استخراج نامفضاهای یک سند XML در PHP است. با استفاده ترکیبی از children، attributes و registerXPathNamespace میتوان بهسادگی عناصر و صفات مرتبط با هر نامفضا را پردازش کرد. بهعلاوه، توجه به نامفضای پیشفرض و ثبت prefix برای XPath از نکات کلیدی هنگام کار با XML است.
آیا این مطلب برای شما مفید بود ؟



