溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

什么是XML文法分析

發(fā)布時(shí)間:2020-07-14 16:52:04 來(lái)源:億速云 閱讀:288 作者:Leah 欄目:編程語(yǔ)言

什么是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)意為 &lt生成<,&gt生成>,&amp生成&,&apos生成’,&quot生成”

  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è)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI