Expat extension libles စာကြည့်တိုက်များအသုံးပြုခြင်းသည် PHP တွင် XML ဒေတာများကိုလုပ်ဆောင်ရန်ထိရောက်သောနည်းလမ်းဖြစ်သည် ။ ဤလုပ်ဆောင်မှုသည်ခွဲခြမ်းစိတ်ဖြာကြေငြာချက်၏အဆုံးကိုအဆုံးကိုတွေ့သောအခါကိုင်တွယ်သော handler ကိုဖွင့်ရန်အသုံးပြုသည်။ သို့သော်အမှန်တကယ်အသုံးပြုသောအခါ developer များက parser ပြည်နယ်ခြွင်းချက်များ, မမှန်မကန် namesback function processings ကဲ့သို့သောခြွင်းချက်များနှင့်ရင်ဆိုင်ရနိုင်သည် ။
ပထမဥပမာကိုကြည့်ကြစို့။
$parser = xml_parser_create();
function end_ns_handler($parser, $prefix) {
echo "namespace ကြေညာချက်အဆုံးသတ်:$prefix\n";
}
xml_set_end_namespace_decl_handler($parser, "end_ns_handler");
ဤလုပ်ဆောင်ချက်သည် namespace ၏အဆုံးနှင့်အတူပရိုဆက်ဆာကိုမှတ်ပုံတင်သည်။ XML parser သည် namespace နယ်ပယ်အဆုံးသတ်ကြောင်းအသိအမှတ်ပြုသည့်အခါ end_ns_Handler function ကိုခေါ်လိမ့်မည်။
အကယ်. သင်ထောက်ပံ့သော handler function သည်မတည်ရှိပါကသို့မဟုတ် parameter definition သည်မမှန်ကန်ပါက၎င်းသည် runtime အမှားတစ်ခုဖြစ်ပေါ်စေလိမ့်မည်။ ဥပမာအားဖြင့်:
xml_set_end_namespace_decl_handler($parser, "undefined_function");
ဖြေရှင်းချက် - callback function ကိုတည်ရှိပြီးပရိုဆက်ဆာကိုမှတ်ပုံတင်ခြင်းမပြုမီ parameter လက်မှတ်လက်မှတ်သည်မှန်ကန်ကြောင်းသေချာစေပါ။
if (function_exists("end_ns_handler")) {
xml_set_end_namespace_decl_handler($parser, "end_ns_handler");
} else {
error_log("namespace processor function ကိုမသတ်မှတ်ပါ。");
}
အကယ်. Parser ကိုဖုန်းဆက်စဉ်အတွင်းထုတ်ပြန်ခြင်းသို့မဟုတ်အမှားပြုမိပါကပရိုဆက်ဆာကိုဖုန်းဆက်ပြီးသတိပေးလိမ့်မည်မဟုတ်ပါ။
ဖြေရှင်းချက် - Parseror function ကိုမခေါ်မီ parser သည်ခိုင်လုံသောအခြေအနေတွင်ရှိနေသေးကြောင်းသေချာအောင်လုပ်ပါ။
if (is_resource($parser)) {
xml_set_end_namespace_decl_handler($parser, "end_ns_handler");
} else {
throw new Exception("XML အဆိုပါ parser မမှန်ကန်တဲ့သို့မဟုတ်ဖြန့်ချိခဲ့သည်。");
}
အကယ်. XML စာရွက်စာတမ်းကို Namespace ကြေငြာစာတမ်းတွင်မှားယွင်းစွာပုံစံချထားပါက၎င်းသည် Namespace Processor ကိုဖြစ်ပေါ်စေပြီးခွဲခြမ်းစိတ်ဖြာခြင်းအမှားတစ်ခုပြုလုပ်လိမ့်မည်မဟုတ်ပါ။
ဖြေရှင်းချက် - 4 င်း၏ format ကိုမခွဲမီ XML အကြောင်းအရာကိုကြိုတင်စစ်ဆေးပါသို့မဟုတ်အမှားကိုဖမ်းရန် LibxMl_use_internal_Internal_Eruor () ကိုသုံးပါ။
libxml_use_internal_errors(true);
$xml = '<root xmlns:ex="http://gitbox.net/ns"></root>';
if (!xml_parse($parser, $xml)) {
$code = xml_get_error_code($parser);
$message = xml_error_string($code);
error_log("XML အမှားခွဲခြမ်းစိတ်ဖြာခြင်း: $message");
}
ကြံ့ခိုင်မှုကိုတိုးတက်စေရန်အတွက် - မည်သည့်ခြွင်းချက်အခြေအနေတွင်မဆိုရှင်းရှင်းလင်းလင်းအပြောင်းအလဲနဲ့လမ်းကြောင်းရှိကြောင်းသေချာစေရန် try-catch structure တစ်ခုလုံးကိုသင်အသုံးပြုနိုင်သည်။
try {
$parser = xml_parser_create();
if (!function_exists("end_ns_handler")) {
throw new Exception("namespace အဆုံးအပြောင်းအလဲနဲ့ function ကိုမသတ်မှတ်ပါ");
}
xml_set_end_namespace_decl_handler($parser, "end_ns_handler");
$xmlData = file_get_contents("https://gitbox.net/data/sample.xml");
if (!xml_parse($parser, $xmlData)) {
throw new Exception("XML ခွဲခြမ်းစိတ်ဖြာခြင်းမအောင်မြင်ပါ: " . xml_error_string(xml_get_error_code($parser)));
}
xml_parser_free($parser);
} catch (Exception $e) {
error_log("ကိုင်တွယ်ဖြေရှင်းသည် XML ခြွင်းချက်တစ်ခုနေစဉ်:" . $e->getMessage());
}
xml_set_end_endnonface_Decl_Handler ကိုသုံးသောအခါ namespace များကိုကိုင်တွယ်ရန်လုပ်ဆောင်သည့်အခါ, ဤဆောင်းပါးသည် developer များကသာမန်လူများအကြောင်း 0 င်ရောက်ခြင်းနှင့် changust xml ခွဲခြမ်းစိတ်ဖြာခြင်းကိုကျင့်သုံးခြင်းနှင့်ခြွင်းချက်ဇာတ်လမ်းခွဲခြမ်းစိတ်ဖြာခြင်းမှအကောင်အထည်ဖော်ရန်ကူညီသည်။ 0 န်ဆောင်မှု၏ကြိုတင်ခန့်မှန်းမှုနှင့်လုံခြုံမှုကိုသေချာစေရန်ပြင်ပ XML အရင်းအမြစ်များကိုမိတ်ဆက်ပေးချိန်တွင်ပြင်ပ XML အရင်းအမြစ်များကိုမိတ်ဆက်ပေးသည့်အခါတင်းကျပ်သော checksum အမှားသစ်ထုတ်လုပ်ရန်အမြဲအကြံပြုသည်။