လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> XML_Parse ကို parser ကိုပြန်လည်မသတ်မှတ်ဘဲအကြိမ်ပေါင်းများစွာဟုခေါ်သောအခါအဘယ်ကြောင့်ဘုံပြ problems နာများကြုံတွေ့ရသနည်း။

XML_Parse ကို parser ကိုပြန်လည်မသတ်မှတ်ဘဲအကြိမ်ပေါင်းများစွာဟုခေါ်သောအခါအဘယ်ကြောင့်ဘုံပြ problems နာများကြုံတွေ့ရသနည်း။

M66 2025-04-28

PHP ၏ XML Parser (ပုံမှန်အားဖြင့် XML_Parser_Create () နှင့် xml_parse ကဲ့သို့သော Expat-based function များကိုအသုံးပြုသောလုပ်ငန်းဆောင်တာများ) ကိုအသုံးပြုသောအခါ XML_Parse () ()) သည် XML data blocks ကိုခွဲခြမ်းစိတ်ဖြာရန်ပရိုဂရမ်တွင်အကြိမ်ကြိမ်ခေါ်ဆိုသည်။ ခွဲခြမ်းစိတ်ဖြာခြင်းမပြုမီ parser ကိုစနစ်တကျပြန်လည်မသတ်မှတ်ခြင်းသို့မဟုတ်ပြန်လည်မတည်ဆောက်ပါက၎င်းသည်မမျှော်လင့်သောပြ problems နာများစွာကိုဖြစ်ပေါ်စေသည်။ ဤပြ problems နာများအတွက်အကြောင်းပြချက်များနှင့်၎င်းတို့ကိုမည်သို့ရှောင်ရှားရန်အကြောင်းရင်းကိုအသေးစိတ်လေ့လာကြပါစို့။

1 ။ Parser status ကိုမရှင်းလင်းပါ, ဒေတာညစ်ညမ်းမှုကိုဖြစ်ပေါ်စေသည်

XML Parser သည်လက်ရှိခွဲခြမ်းစိတ်ဖြာခြင်း၏နက်နဲသောအရာကဲ့သို့ဖြစ်လိမ့်မည်။

ဥပမာ -

 $xml1 = "<note><to>John</to></note>";
$xml2 = "<message><from>Jane</from></message>";

$parser = xml_parser_create();

// ပထမ ဦး ဆုံးသုံးသပ်ချက်
xml_parse($parser, $xml1);

// ဒုတိယ parser ကိုအသုံးပြုသည်
xml_parse($parser, $xml2); // parsing အမှားများဖြစ်ပေါ်စေနိုင်သည်!

xml_parser_free($parser);

အထက်ပါကုဒ်တွင် XML2 ဒေတာကိုဒုတိယအကြိမ်ခွဲခြမ်းစိတ်ဖြာသည့်အခါ $ parser သည် Syntax အမှားအယွင်းများ,

2 ။ အဆိုပါ callback function ကိုပြည်နယ် obfuscated ဖြစ်ပါတယ်

XML parser သည် XML_SET_ELEMEMER_HANDLER () မှတစ်ဆင့် callback function ကို setting ကိုခွင့်ပြုသည်။ ဤရွေ့ကားပြန်ခေါ်ချက်များများသောအားဖြင့်အချို့သောပြင်ပ variable တွေကိုသို့မဟုတ်ပြည်နယ်များအပေါ်အားကိုး။ အခြေအနေသို့မဟုတ်ပြည်နယ် variable များကိုမျိုးစုံအကြားစနစ်တကျသန့်ရှင်းရေးမလုပ်ပါကအချက်အလက်ရှုပ်ထွေးမှုများကိုဖြစ်ပေါ်စေသည်။

ဥပမာ -

 function startElement($parser, $name, $attrs) {
    echo "tag ကိုစတင်ပါ: $name\n";
}

function endElement($parser, $name) {
    echo "tag tag: $name\n";
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");

$xml = "<user><name>စမ်းသပ်မှု</name></user>";
xml_parse($parser, $xml);

// ထို့နောက်အခြားစာရွက်စာတမ်းခွဲပါ
$xml2 = "<product><title>ကုန်ပစ္စည်း</title></product>";
xml_parse($parser, $xml2); // အဆိုပါ callback ကိုမလျော်ကန်စွာကိုင်တွယ်နိုင်ပါသည်

$ parser သည် ပြန်လည်မသတ်မှတ်ခြင်းမဟုတ်ဘဲ, callback ၏စည်းမျဉ်းစည်းကမ်းများသို့မဟုတ်အချို့သောပြည်တွင်းရေးအခြေအနေများသည်ပုံမှန်မဟုတ်သောကြောင့်ယုတ္တိဗေဒအပြောင်းအလဲအတွက်ရှုပ်ထွေးမှုများဖြစ်ပေါ်လာနိုင်သည်။

3 ။ မကိုမာသော encoding code သို့မဟုတ်အမှားများကို barbled code သို့မဟုတ်အမှားဖြစ်ပေါ်စေသည်

ကွဲပြားခြားနားသော encodings မသုံးမီ xml စာရွက်စာတမ်းများ (ဥပမာ - 8) သည် UTF-8 နှင့်အခြားတစ်ခုမှာ ISO-8859-1 ဖြစ်သည်။

 $parser = xml_parser_create("UTF-8");

$xml1 = "<?xml version='1.0' encoding='UTF-8'?><data>မင်္ဂလာပါ</data>";
$xml2 = "<?xml version='1.0' encoding='ISO-8859-1'?><data>Olá</data>";

xml_parse($parser, $xml1);
xml_parse($parser, $xml2); // coding ပ conflict ိပက်ခ,အမှားတစ်ခုသတင်းပို့နိုင်ပါသည်

မှန်ကန်သောနည်းလမ်း - ပြန်လည်တည်ဆောက်ခြင်း parser ကို reset သို့မဟုတ်ဖျက်ဆီးပစ်ပါ

အထက်ပါပြ problems နာများကိုရှောင်ရှားရန် XML စာရွက်စာတမ်းအသစ်တစ်ခုသည်ခွဲခြမ်းစိတ်ဖြာပြီးနောက်အချိန်တိုင်းတွင်အကောင်းဆုံးအလေ့အကျင့်သည် parser ဥပမာတစ်ခုဖန်တီးရန်ဖြစ်သည်။

 function parseXml($xmlString) {
    $parser = xml_parser_create("UTF-8");

    xml_parse($parser, $xmlString, true);
    xml_parser_free($parser);
}

$xml1 = "<note><to>John</to></note>";
$xml2 = "<message><from>Jane</from></message>";

parseXml($xml1);
parseXml($xml2);

၎င်းသည်ပြည်နယ် 0 င်ရောက်စွက်ဖက်ခြင်း,

ကောက်ချက်

XML အချက်အလက်မျိုးစုံကိုပြုပြင်သည့်အခါ parser ကို "သန့်ရှင်း" ရန်အရေးကြီးသည်။ Parser ကိုတိုက်ရိုက်ပြန်လည်အသုံးပြုခြင်းသည်အရင်းအမြစ်များကိုချွေတာနိုင်ပုံရသော်လည်းရလဒ်မှာညစ်ညမ်းမှု, coding ပ conflicts ိပက်ခများနှင့်အခြားပြ problems နာများမှာအားစိုက်ထုတ်မှုမှာမထိုက်တန်ပါ။ အလုံခြုံဆုံးနည်းမှာ "၎င်းကိုတစ်ချိန်ကအသုံးပြုရန်နှင့်တစ်ချိန်ကတည်ဆောက်ပြီး၎င်းကိုခွဲထုတ်ပြီးနောက်ဖျက်ဆီးခြင်း" ဖြစ်သည်။

အကယ်. သင်သည် XML အချက်အလက်များကိုမကြာခဏလုပ်ဆောင်ရန်လိုအပ်သည့် interface တစ်ခုတည်ဆောက်နေပါကဥပမာ -

  • သက်ဆိုင်သောတက်(ဂ်)များ:

    xml_parse