您好,登錄后才能下訂單哦!
什么是XML文法分析?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
在進(jìn)行XML文法分析之前,首先有必要了解XML語(yǔ)法的基本規(guī)則:
詞法特征:1)XML區(qū)分大小寫(xiě),如元素名在打開(kāi)和關(guān)閉標(biāo)記中應(yīng)保持大小寫(xiě)一致<mytag>…</mytag>,XML的保留詞串應(yīng)符合大小寫(xiě)要求<?xml …> <!ENTITY>…。
2)XML保留標(biāo)記字符為:< > &,http://www.php.cn/wiki/75.html" target="_blank">保留字符不允許出現(xiàn)在元素名、元素文本、屬性名、屬性值中,< 用戶(hù)打開(kāi)標(biāo)記,>用于關(guān)閉標(biāo)記,&用于轉(zhuǎn)意,常見(jiàn)的轉(zhuǎn)意為 <生成<,>生成>,&生成&,&apos生成’,"生成”
3)元素名以下劃線(xiàn)或字母開(kāi)始,可包含字母、數(shù)字、句點(diǎn)、連字符、下劃線(xiàn)、冒號(hào)和用于其他語(yǔ)言的擴(kuò)展字符,元素名中不能有空格符(分格符、跳格符、換行符、回車(chē)符),元素名可以由名域前綴。如:<mytag> <dt:mytag> 元素文本可以是除XML保留字符外的字符集合,如<mytag> my money is $2000 </mytag>
4)屬性名的規(guī)則同元素名,屬性值由單引號(hào)或雙引號(hào)括約其中,可由除XML保留字符以外的字符串組成,如:<mytag myprop=”proper value”>。屬性名有xmlns前綴,表明該屬性定義了一個(gè)名域,如:<mytag xmlns:ns=”http://www.myweb.com/myschema”>
句法特征:1)XML文檔由一個(gè)XML說(shuō)明、多個(gè)可選的文檔說(shuō)明、多個(gè)可選的XML指令、多個(gè)可選的XML注釋和一個(gè)根元素的數(shù)據(jù)體組成,此外還可以有嵌入語(yǔ)句中的CDATA段,如:
<?xml …?> /*XML說(shuō)明*/ <!DOCTYPE …> /*XML文檔說(shuō)明*/ <!-- … --> /*XML注釋*/ <?xml-stylesheet …?> /*XML指令*/ <root> /*根數(shù)據(jù)元素*/ <child> …<![CDATA[…]]> </child> </root>
2)XML說(shuō)明由<?xml打開(kāi),由?>標(biāo)關(guān)閉,其中包含版本、編碼等可選說(shuō)明,如:<?xml version=”1.0” encoding=”UTF-9”?>
3)XML文檔說(shuō)明由<!和保留串打開(kāi),由>關(guān)閉,如:<!DOCTYPE mydoc SYSTEM “mydoc.dtd”>
4)XML指令由<?和保留串打開(kāi),由?>關(guān)閉,如:<?xml-stylesheet type=”text/xsl” href=”mystyle.xsl”?>
5)XML注釋由<!――打開(kāi),由――>關(guān)閉,如:<!-- this is my xml document -->
6)XML元素由<元素名>打開(kāi),由/>,或</元素名>關(guān)閉,元素的打開(kāi)和關(guān)閉標(biāo)記相互匹配,如<myteg ../>或<mytag>…</myteg>,XML的元素允許嵌套,應(yīng)此還應(yīng)保持層次上的匹配,如<myteg><subtag>..</subtag></mytag>。
7)CDTATA段由<![CDATA[>打開(kāi),由]]>關(guān)閉,用于使居于其中的語(yǔ)句規(guī)避XML解析規(guī)則。如:<![CDATA[ select * from mytable where thefield <= ‘100’ ]]>
根據(jù)以上的XML文法特征,可以構(gòu)造出用于詞法分析的正則式和用于句法分析的下推自動(dòng)機(jī)結(jié)構(gòu)。
XML詞法正則式:
#define digit [1,2,…,9] /*數(shù)字字符*/
#define letter [a,b,…,z,A,B,…,Z] /*字母字符*/
#define signs [~, ! , @, #, %, ^, &,*,(, ), ?, :, ;, “, ‘, ,, ., /,-, _, +, =, |, /] /*符號(hào)字符*/
#define ascii2 [0x80,…,0xFF] /*ASCII chart2 擴(kuò)展字符*/
#define space [0x20, /t, /r, /n] /*空格符,跳格符,回車(chē)符,換行符*/
#define reserve [< , >, &] /*XML保留字符*/
1) 元素名的正則式:
element_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
2) 元素文本的正則式:
element_text -> (ε| not reserve)*
3) 屬性名的正則式:
proper_name -> (_ | letter | ascii2) (ε| _ | - | : | . | digit | letter | signs | ascii2)*
4) 屬性文本的正則式:
proper_value -> (ε| not reserve)*
XML句法結(jié)構(gòu):
xml_document -> xml_header (ε| xml_declare | xml_instruct | xml_comments)* xml_element xml_header -> [<?xml](space)*(proper_token)*(space)* [?>] xml_declare -> [<!]reserve_word(space)*(token)*(space)*[>] xml_instruct -> [<?]reserve_word(space)* (proper_token)* (space)*[?>] xml_comments -> [<!--](ε| digit | letter | signs | ascii2 | space)*[-- >] xml_element -> [<]element_name (space)*( ε| proper_token)*(space)*[/>] | [<]element_name(space)*( ε | proper_token)*(space)*[>] [ε| <![CDATA[ ]element_text[ε| ]]>] (ε | xml_element)*(space)*[</]element_name[>] proper_token -> proper_name(space)*[=](space)* [ε| <![CDATA[ ] [‘ | “]proper_value[‘ | “] [ε| ]]>] reserve_word -> [DOCTYPE | ELEMENT | NOTATION | …] token -> (ε| not reserve)*
分析XML文法需要構(gòu)造一個(gè)下推自動(dòng)機(jī),它的結(jié)構(gòu)定義如下:
1)STACK_DFA mata_xml_doc = <Q,Σ,σ,q,Γ,T,S >
Q: {…} /*詳見(jiàn)后面的狀態(tài)集合*/ Σ: /*指向待解析的XML元素詞串*/ σ: Q×Σ->Q /*狀態(tài)轉(zhuǎn)移函數(shù),見(jiàn)狀態(tài)轉(zhuǎn)移列表*/ q: {NIL_SKIP} /*初始狀態(tài)*/ Γ: {NIL_FAILED,NIL_SUCCEED} /*終結(jié)狀態(tài)集合*/ S: {Q/*狀態(tài)*/, N/*DOM節(jié)點(diǎn)*/>,<…>} /*下推棧*/
2)棧頂符集合用于反映當(dāng)前分析節(jié)點(diǎn)的類(lèi)型:
T:{NIL/*空*/, TG/*標(biāo)記*/, NS/*元素*/, IS/*指令*/, DS/*聲明*/, CD/*CDATA界段*/,CM/*注釋*/}
3)狀態(tài)集合反映了分析的某一階段特征,與棧頂符對(duì)應(yīng):
NIL: NIL_FAILED /*失敗*/ NIL_SKIP /*忽略*/ NIL_SUCCEED /*成功*/ CM: CM_BEGIN /*注釋開(kāi)始*/ CM_END /*注釋結(jié)束*/ TG: TG_OPEN /*標(biāo)記打開(kāi)*/ TG_INT_CLOSE /*標(biāo)記中斷*/ TG_PRE_CLOSE /*標(biāo)記準(zhǔn)備關(guān)閉*/ TG_CLOSE /*標(biāo)記關(guān)閉*/ NS: NS_NAME_BEGIN /*元素名開(kāi)始*/ NS_NAME_END /*元素名結(jié)束*/ NS_KEY_BEGIN /*屬性名開(kāi)始*/ NS_KEY_END /*屬性名結(jié)束*/ NS_ASIGN /*屬性賦值*/ NS_VAL_BEGIN /*屬性值開(kāi)始*/ NS_VAL_END /*屬性值結(jié)束*/ NS_TEXT_BEGIN /*元素文本開(kāi)始*/ NS_TEXT_END /*元素文本結(jié)束*/ IS: IS_OPEN /*指令打開(kāi)*/ IS_NAME_BEGIN /*指令名開(kāi)始*/ IS_NAME_END /*指令名結(jié)束*/ IS_KEY_BEGIN /*指令鍵開(kāi)始*/ IS_KEY_END /*指令鍵結(jié)束*/ IS_ASIGN /*賦值符*/ IS_VAL_BEGIN /*指令值開(kāi)始*/ IS_VAL_END /*指令值結(jié)束*/ IS_CLOSE /*指令關(guān)閉*/ DS: DS_OPEN /*聲明打開(kāi)*/ DS_SKIP /*越過(guò)申明節(jié)*/ DS_CLOSE /*聲明關(guān)閉*/ CD: CD_BEGIN /*CDATA界段開(kāi)始*/ CD_END /*CDATA界段結(jié)束*/
看完上述內(nèi)容,你們掌握什么是XML文法分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。