تنظیم loader موجودیت خارجی (libxml_set_external_entity_loader)
گاهی XML به «موجودیت خارجی (External Entity)» اشاره می کند. با «loader موجودیت خارجی» می گوییم این منابع چگونه بارگذاری شوند. تابع libxml_set_external_entity_loader() همین بارگذار پیش فرض را عوض می کند.
تعریف و کاربرد
طبق منبع، این تابع «loader موجودیت خارجی» را تغییر می دهد. باید یک تابع بدهی که سه ورودی دارد: public و system و context. خروجی می تواند یک resource، یک رشته مسیر قابل باز شدن، یا NULL باشد.
سینتکس
libxml_set_external_entity_loader(function ($public, $system, $context) {});
نمونه کد بازنویسی شده
در این نمونه، یک DTD ساختگی از حافظه برمی گردانیم و سند را اعتبارسنجی می کنیم.
<?php
$xml = <<<XML
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar">
<foo>bar</foo>
XML;
$dtd = <<<DTD
<!ELEMENT foo (#PCDATA)>
DTD;
libxml_set_external_entity_loader(function ($public, $system, $context) use ($dtd) {
$f = fopen("php://temp", "r+");
fwrite($f, $dtd);
rewind($f);
return $f;
});
$doc = new DOMDocument();
$result = $doc->loadXML($xml);
echo $result ? "XML loaded." : "Load failed.";
echo "\n";
echo $doc->validate() ? "Valid." : "Invalid.";
echo "\n";
?>
گام های عملی
- XML و DTD نمونه را آماده کن.
- یک loader موجودیت خارجی تنظیم کن.
- XML را لود و سپس اعتبارسنجی کن.
نکته: اگر نمی خواهی موجودیت خارجی بارگیری شود، به جای تنظیم loader از libxml_disable_entity_loader کمک بگیر. برای گزارش خطاها، libxml_get_errors را ببین. همچنین از همین صفحه برای عبارت «loader موجودیت خارجی» استفاده کن.
جمع بندی سریع
- این تابع بارگذار موجودیت خارجی را عوض می کند.
- کالبک سه ورودی می گیرد و منبع برمی گرداند.
- مواظب امنیت XML و منابع بیرونی باش.
- در صورت نیاز، بارگیری را کامل غیرفعال کن.