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

黄舟
リリース: 2017-03-24 16:47:35
オリジナル
1459 人が閲覧しました

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

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

2) XML の予約マーク文字は、 < 、要素テキスト、属性名、属性値、 < はタグを閉じるために使用され、 > は意味を変更するために使用されます。 、&generate&、&apos Generate'、"generate"

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

2) XML 記述は マークによって閉じられます。これには、次のようなバージョンやエンコーディングなどのオプションの記述が含まれます。 「UTF-9」? >

3) XML ドキュメント命令は で閉じます。例:

4) XML 命令は、 で閉じられます。例: 5) XML コメント によって開かれます。たとえば、 6) XML 要素は <要素名> によって開かれ、閉じられます。 /> または によって、要素は開始タグと終了タグが相互に一致します ( または )。したがって、... などの階層的な一致を維持する必要があります。

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

上記の 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 [<, >, &] /*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 =


 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート