ホームページ >バックエンド開発 >XML/RSS チュートリアル >Webプログラミング ~XML文法解析の詳しい解説~

Webプログラミング ~XML文法解析の詳しい解説~

黄舟
黄舟オリジナル
2017-03-24 16:47:351469ブラウズ

XML 文法分析を実行する前に、まず XML 構文の基本規則を理解する必要があります:

字句の特徴: 1) XML では大文字と小文字が区別されます。たとえば、要素名は開始タグと終了タグで大文字と小文字が区別される必要があります。 1b01232ea6f0577bc4ec8d1a522b6a86 …6879c8de8c5e2889d23c06f516d46b6b、XML 予約語文字列は 40eed24cbc9faf0c347d89425ab61f30 8f52c3d5f1e09e976c814aa1b0a986bd… を満たしている必要があります。

2) XML の予約マーク文字は、 c546791e694512b799aaef01e3bc7dbb は意味を変更するために使用されます。 9a3a242e1b81aa606e919bf8005758f6、&generate&、&apos Generate'、"generate"

<?xml …?> /*XML说明*/   <!DOCTYPE …> /*XML文档说明*/   <!-- … --> /*XML注释*/   <?xml-stylesheet …?> /*XML指令*/   <root> /*根数据元素*/   <child>   …<![CDATA[…]]>   </child>   </root>

%202)%20XML%20%E8%A8%98%E8%BF%B0%E3%81%AF%203044cb62862c40ff33d42a12e7991ccc%20%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E9%96%89%E3%81%98%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%81%AF%E3%80%81%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%84%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%A8%98%E8%BF%B0%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%20%E3%80%8CUTF-9%E3%80%8D?%20>

%203)%20XML%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E5%91%BD%E4%BB%A4%E3%81%AF%2099fb79990181a581c8005d5903d90da9%20%E3%81%A7%E9%96%89%E3%81%98%E3%81%BE%E3%81%99%E3%80%82%E4%BE%8B:%20b0562c0c44b641eeacc25e464572cc90

%204)%20XML%20%E5%91%BD%E4%BB%A4%E3%81%AF%E3%80%8120a71ce4b500a45e71e6fa343f518000%20%E3%81%A7%E9%96%89%E3%81%98%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E4%BE%8B:%20e129ac797af2463f2cbe789c97735130 5) XML コメント36549b1dafd5a429d3a9f3289df32431 によって開かれます。たとえば、9ef2872f30659e7a461b61bee7f4943e 6) XML 要素は 692644aefdad9a58fa537718135614aa によって開かれ、閉じられます。 /> または ec5e4c4c327f5c6e14946bb522265329 によって、要素は開始タグと終了タグが相互に一致します (bf5181c8226ee8e19fd67e3f913eb780 または 1b01232ea6f0577bc4ec8d1a522b6a86…178733e97ec71b870a77daafc67e8e0b)。したがって、... などの階層的な一致を維持する必要があります。

7) CDTATA セグメントは 4bef20c9f836c1fb85f150a06f5b108c] によって開かれ、[]]> によって閉じられます。これは、その中のステートメントが XML 解析ルールを回避するために使用されます。例: 093148c15d63929c640da2944ff08635

上記の XML 文法特徴に基づいて、字句解析用の正規表現と構文解析用のプッシュダウンをオートマトン構造で構築できます。
XML字句正規表現:
#define digit [1,2,…,9] /*数字*/
#definecharacter [a,b,…,z,A,B,…,Z] /*英字*/
#define 記号 [~, ! , @, #, %, ^, &,*,(, ), ?, :, ;, “, ', ,, ., /,-, _, +, = , |, /] /*記号文字*/
#define ascii2 [0x80,…,0xFF] /*ASCIIチャート2拡張文字*/
#define space [0x20, /t, /r, /n] /*スペース文字、タブ文字、復帰文字、改行文字 */
#definereserve [95ec6993dc754240360e28e0de8de30a, &] /*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構文構造:

 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文法の解析にはプッシュダウンオートマトンの構築が必要、その構造は次のように定義されます:

1) STACK_DFA mata_xml_doc = c2c00a4f81bdb39f559c7014143f40dc


 Q: {…} /*详见后面的状态集合*/
  Σ: /*指向待解析的XML元素词串*/
  σ: Q×Σ->Q /*状态转移函数,见状态转移列表*/
  q: {NIL_SKIP} /*初始状态*/
  Γ: {NIL_FAILED,NIL_SUCCEED} /*终结状态集合*/
  S:  {Q/*状态*/, N/*DOM节点*/>,<…>} /*下推栈*/

2) スタックトップシンボルセットは、現在の分析ノード:

T:{NIL/*空*/, TG/*标记*/, NS/*元素*/, IS/*指令*/, DS/*声明*/, CD/*CDATA界段*/,CM/*注释*/}

3) 状態セットは、スタックの最上位シンボルに対応する、分析の特定の段階の特性を反映します:

 NIL:  NIL_FAILED /*失败*/
  NIL_SKIP /*忽略*/
  NIL_SUCCEED /*成功*/
  CM:  CM_BEGIN /*注释开始*/
  CM_END /*注释结束*/
  TG:  TG_OPEN /*标记打开*/
  TG_INT_CLOSE /*标记中断*/
  TG_PRE_CLOSE /*标记准备关闭*/
  TG_CLOSE /*标记关闭*/
  NS:  NS_NAME_BEGIN /*元素名开始*/
  NS_NAME_END /*元素名结束*/
  NS_KEY_BEGIN /*属性名开始*/
  NS_KEY_END /*属性名结束*/
  NS_ASIGN /*属性赋值*/
  NS_VAL_BEGIN /*属性值开始*/
  NS_VAL_END /*属性值结束*/
  NS_TEXT_BEGIN /*元素文本开始*/
  NS_TEXT_END /*元素文本结束*/
  IS:  IS_OPEN /*指令打开*/
  IS_NAME_BEGIN /*指令名开始*/
  IS_NAME_END /*指令名结束*/
  IS_KEY_BEGIN /*指令键开始*/
  IS_KEY_END /*指令键结束*/
  IS_ASIGN /*赋值符*/
  IS_VAL_BEGIN /*指令值开始*/
  IS_VAL_END /*指令值结束*/
  IS_CLOSE /*指令关闭*/
  DS:  DS_OPEN /*声明打开*/
  DS_SKIP /*越过申明节*/
  DS_CLOSE /*声明关闭*/
  CD:  CD_BEGIN /*CDATA界段开始*/
  CD_END /*CDATA界段结束*/

以上がWebプログラミング ~XML文法解析の詳しい解説~の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。