PHP XML Expat パーサ

コース推薦:

内蔵の Expat 解析器により、PHP で XML 文書を処理することが可能になります。

XML とは何ですか?

XML では、プレデファインドのタグはありません。自分自身のタグを定義する必要があります。

XML に関する詳細な情報を学びたい場合は、以下のウェブサイトを訪れてください: XML 教程

Expat とは何ですか?

読み取りと更新 - 作成および処理 - XML 文書の場合、XML 解析器が必要です。

基本的な XML 解析器の種類には 2 つあります:

  • ツリーベースの解析器:この解析器は XML 文書を木構造に変換します。全体の文書を分析し、ドキュメントオブジェクトモデル (DOM) などの要素にアクセスするための API を提供します。
  • イベントベースの解析器:XML 文書を一連のイベントとして見なします。特定のイベントが発生した場合、解析器は関数を呼び出して処理します。

Expat 解析器はイベントベースの解析器です。

イベントベースの解析器は XML 文書の内容に集中しており、結果には集中しません。そのため、イベントベースの解析器はツリーベースの解析器よりもデータにアクセスする速度が速くなります。

以下の XML 片断をご覧ください:

<from>ジョン</from>

イベントベースの解析器は上記の XML を一連の 3 つのイベントとして報告します:

  • 開始要素:from
  • CDATA 部分の開始、値:ジョン
  • 閉じる要素:from

上記の XML 例は形式良好な XML を含んでいますが、この例は有効な XML ではありません。なぜなら、関連するドキュメントタイプ宣言 (DTD) がなく、内蔵の DTD もありません。

ただし、Expat 解析器を使用する場合、これは違いありません。Expat は有効性をチェックしない解析器であり、DTD を無視します。

イベントベースで、検証をしない XML 解析器であるため、Expat は高速で軽量で、PHP のウェブアプリケーションに非常に適しています。

注:XML 文書は形式良好でなければなりません。形式が悪いと Expat はエラーを生成します。

インストール

XML Expat 解析器は PHP の核心の一部です。これらの関数を使用するにはインストールする必要はありません。

XML ファイル

この例では以下の XML ファイルを使用します:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>ジョージ</to>
<from>ジョン</from>
<heading>リマインダー</heading>
<body>ミーティングを忘れないで!</body>
</note>

XMLパーサを初期化

PHPでXMLパーサを初期化し、異なるXMLイベントに対してハンドラを定義し、そのXMLファイルを解析します。

<?php
//XMLパーサを初期化
$parser=xml_parser_create();
//要素の始めに使用する関数
function start($parser,$element_name,$element_attrs)
  {
  switch($element_name)
    {
    case "NOTE":
    echo "-- 注意 --<br />";
    break; 
    case "TO":
    echo "To: ";
    break; 
    case "FROM":
    echo "From: ";
    break; 
    case "HEADING":
    echo "ヘッディング: ";
    break; 
    case "BODY":
    echo "メッセージ: ";
    }
  }
//要素の終わりに使用する関数
function stop($parser,$element_name)
  {
  echo "<br />";
  }
//キャラクタデータを見つけたときに使用する関数
function char($parser,$data)
  {
  echo $data;
  }
//要素ハンドラを指定
xml_set_element_handler($parser,"start","stop");
//データハンドラを指定
xml_set_character_data_handler($parser,"char");
//XMLファイルを開く
$fp=fopen("test.xml","r");
//データを読み込む
while ($data=fread($fp,4096))
  {
  xml_parse($parser,$data,feof($fp)) or 
  die (sprintf("XML エラー: %s 行 %d", 
  xml_error_string(xml_get_error_code($parser)),
  xml_get_current_line_number($parser)));
  }
// XML パーサーを解放
xml_parser_free($parser);
?>

上記のコードの出力:

-- 注意 --
まで: George
から: John
見出し: リマインダー
メッセージ: 会議を忘れずに!

動作原理解説:

  • xml_parser_create() 関数を使用して XML 解析器を初期化します。
  • 異なるイベントハンドラープログラムに対応する関数を作成します。
  • パーサーが始めと終わりのタグに遭遇したときに実行する関数を定義するために xml_set_element_handler() 関数を追加します。
  • パーサーが文字データに遭遇したときに実行する関数を定義するために xml_set_character_data_handler() 関数を追加します。
  • ファイル「test.xml」を解析するために xml_parse() 関数を使用します。
  • エラーがある場合、xml_error_string() 関数を使用して XML エラーをテキスト説明に変換します。
  • xml_parser_create() 関数に割り当てられたメモリを解放するために xml_parser_free() 関数を呼び出します。

PHP Expat パーサーの詳細情報

PHP Expat 関数に関する詳細情報が必要な場合は、PHP XML Parser 参考手引にアクセスしてください。