| | PHP で XML をシリアル化する | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
| |物語のひねり |
XML_Serializer クラスは、PHP 拡張機能およびアプリケーション リポジトリ (http://pear.php.net) である PEAR の厚意により提供され、phptools.de で有名な Stephan Schmidt によって開発されました。ご存知ない方のために付け加えておきますが、PEAR は無料の PHP ソフトウェアのオンライン リポジトリで、データ アーカイブから XML 解析まであらゆるクラスやモジュールが含まれています。 PHP をインストールすると、多数の PEAR モジュールも同様にインストールされます。
PHP ディストリビューションに XML_Serializer が含まれていない場合は、公式 PEAR Web サイト (http://pear.php) からコピーを入手できます。 .net - 配布アーカイブを PEAR ディレクトリに解凍するだけで準備完了です。
XML_Serializer を使用するには、XML_Util パッケージがすでにインストールされている必要があることに注意してください。まだお持ちでない場合は、上記の Web サイトから入手できます。
まずは簡単なことから始めましょう - PHP 配列から XML ドキュメントを動的に構築します。コードは次のとおりです:
// include class file include("Serializer.php");
// create object $serializer = new XML_Serializer();
// シリアル化する配列を作成 $xml = array ( "book" => array ( "title" => "オリバー・ツイスト", "著者" => "チャールズ・ディケンズ"));
// シリアル化を実行します $result = $serializer- >serialize($xml);
// 結果コードをチェックし、成功した場合は XML を表示します if($result === true) { echo $serializer->getSerializedData(); }
?>
あまり意味がわからなくても心配しないでください。すべてはすぐに説明されます。現時点では、出力を見て楽しんでください (これを表示するには、ブラウザの「ソースを表示」機能を使用する必要がある場合があることに注意してください):
Charles Dickens
ご覧のとおり、スクリプトの出力は整形式の XML ドキュメントです。すべて PHP コードを使用して作成されます。 PHP で XML をシリアル化する | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
|解剖学クラス |
私がどのようにしてこれを達成したかを詳しく見てみましょう。
1.最初のステップは、明らかに、XML_Serializer クラス ファイルをインクルードすることです:
// include class file include("Serializer.php");
?>
これへの絶対パスを指定することもできます。ファイルを作成するか、ほとんどの怠惰なプログラマーが行うことと同じことを行います。PHP の「include_path」変数に PEAR インストールへのパスを含めます。これにより、長く複雑なファイル パスを入力することなく、PEAR クラスのいずれかにアクセスできるようになります。
2.次に、クラスのオブジェクトを初期化し、PHP 変数に割り当てる必要があります。
// create object $serializer = new XML_Serializer();
?>
この変数はコントロールとして機能しますXML_Serializer のプロパティとメソッドを今後操作するためのポイントです。
3.次に、XML でエンコードする予定のデータをまとめる必要があります。これを行う最も簡単な方法は、構造が目的の最終的な XML ドキュメントの構造を模倣したネストされた配列のセットを作成することです
// シリアル化する配列を作成します $xml = array ( "book" => array ( "タイトル" => "オリバー・ツイスト"、 "著者" => "チャールズ・ディケンズ"));
?>
4.すべての要素が揃ったら、あとは変換を実行するだけです。これは、オブジェクトの Serialize() メソッドを介して行われます。このメソッドは、PHP 構造体を受け入れ、シリアル化が成功したかどうかを示す結果コードを返します。
// シリアル化を実行します $result = $serializer->serialize($ xml);
?>
5.シリアル化が完了したら、それをファイルに書き込んだり、SAX パーサーに渡したり、またはここで行ったように、単に画面に出力して全員が鑑賞できるようにするなど、それを使って何か役に立つことができます:
// 結果コードをチェックし、成功した場合は XML を表示します if($result === true) { echo $serializer->getSerializedData(); }
?>
getSerializedData() メソッドは、シリアル化された XML ドキュメント ツリーはそのままで、デバッグに非常に便利な目的を果たします。次の数ページで頻繁に表示されます。
|
PHP を使用した XML のシリアル化 | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
|総合的な満足度 |
さて、あなたが細かいことを言う人であれば、前のページの例の出力ではまだ満足できないでしょう。その理由は次のとおりです:
1.シリアル化された XML ドキュメントには、先頭に XML 宣言が含まれていません。
2.ドキュメントのルート要素は と呼ばれますが、実際に必要なのは .
3 です。 XML ドキュメントは正しくインデントされていません。
これらの要件に対応するために、XML_Serializer には setOption() メソッドが付属しており、これを使用してシリアライザーの動作をニーズに合わせてカスタマイズできます。上記の最初の問題を解決する次の例を考えてみましょう。
// include class file include("Serializer.php");
// create object $serializer = new XML_Serializer();
// シリアル化する配列を作成します $xml = array ( "book" => array ( "title" => "オリバー・ツイスト", "author" => "チャールズ・ディケンズ")); // XML 宣言を追加 $serializer->setOption("addDecl", true);
// シリアル化を実行 $result = $serializer->serialize($xml);
// 結果コードを確認し、成功した場合は XML を表示します if($result === true) { echo $serializer->getSerializedData(); }
?>
出力は次のとおりです:
Charles Dickens
したがって、setOption() メソッドは 2 つの引数 (変数とその値) を受け取り、その情報を使用してシリアライザーに XML ドキュメントを返す方法を指示します。
次に、ルート要素とインデントを修正する方法について説明します。 ?
// クラスファイルをインクルード include("Serializer.php");
// オブジェクトを作成 $serializer = new XML_Serializer();
// シリアル化する配列を作成 $xml = array ( 「本」=> array ( "title" => "Oliver Twist", "author" => "Charles Dickens"));
// XML宣言を追加 $serializer->setOption("addDecl", true);
// 要素をインデントします $serializer->setOption("indent", " ");
// ルート要素の名前を設定します $serializer->setOption("rootName", "library"); // シリアル化を実行します $result = $serializer->serialize($xml);
// 結果コードをチェックし、成功した場合は XML を表示します if($result === true) { echo $serializer-> getSerializedData(); }
?>
そして結果は次のとおりです:
Charles Dickens
Preてぃーですね
|
PHP を使用した XML のシリアル化 | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
|出典なし |
さて、それらの厄介な属性についてはどうですか? XML_Serializer には、配列キーを (要素自体ではなく) 囲んでいる要素の属性として表現できるオプションが付属しています。見てみましょう:
// include class file include("Serializer.php");
// create object $serializer = new XML_Serializer();
// シリアル化する配列を作成 $xml = array ( "book" => array ( "title" => "オリバー・ツイスト", "author" => "チャールズ・ディケンズ"));
// XML 宣言を追加します $serializer-> setOption("addDecl", true);
// 要素をインデントします $serializer->setOption("indent", " ");
// ルート要素の名前を設定します $serializer->setOption("rootName ", "library");
// 要素の代わりにスカラー値を属性として表現します $serializer->setOption("scalarAsAttributes", true); // シリアル化を実行します $result = $serializer->serialize ($xml);
// 結果コードをチェックし、成功した場合は XML を表示します if($result === true) { echo $serializer->getSerializedData(); }
?>
出力は次のとおりです。
これが機能するためには、属性として表現される配列キーが別の配列やオブジェクトではなく、単一のスカラー値を指している必要があることに注意してください。これをよりよく理解するために、違いを示す次の例を検討してください。
// include class file include("Serializer.php");
// create object $serializer = new XML_Serializer(); // シリアル化する配列を作成します $xml = array ( "book" => array ( "title" => "オリバー・ツイスト", "著者" => "チャールズ・ディケンズ", "価格" => array ( "currency" => "USD", "amount" => 24.50)));
// XML 宣言を追加 $serializer->setOption("addDecl", true); // 要素をインデントする $serializer->setOption("indent", " ");
// ルート要素の名前を設定する $serializer->setOption("rootName", "library");
/ / 要素の代わりにスカラー値を属性として表します $serializer->setOption("scalarAsAttributes", true); // シリアル化を実行します $result = $serializer->serialize($xml);
// check成功した場合は結果コードと XML を表示します if($result === true) { echo $serializer->getSerializedData(); }
?>
そして、修正された出力は次のとおりです:
ルートノードに属性を追加するには、以下のように「rootAttributes」オプションを使用して属性を設定します:
// include class file include("Serializer.php");
// create object $serializer = new XML_Serializer();
// create array $xml = array("name" => "ジョン・ドゥ"、"年齢" => 34、「性別」=> "male");
// XML 宣言を追加 $serializer->setOption("addDecl", true);
// 要素をインデント $serializer->setOption("indent", " "); // ルート要素の名前を設定します $serializer->setOption("rootName", "person");
// ルート要素の属性を設定します $serializer->setOption("rootAttributes", array("id " => 346747));
// シリアル化を実行します $result = $serializer->serialize($xml);
// 結果コードを確認し、成功した場合は XML を表示します if($result === true ) { echo $serializer->getSerializedData(); }
?>
出力は次のとおりです:
John Doe 34 男性
| PHP で XML をシリアル化する | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
|オブジェクトのレッスン |
配列をシリアル化するのとほぼ同じ方法で、オブジェクトをシリアル化することもできます。次の例を見てください。その方法を示しています。
// オブジェクト定義 class Automobile {
// オブジェクトのプロパティ var $color; var $year; var $model;
function setAttributes ($c, $y, $m) { $this->color = $c; $this->year = $y; $this->model = $m; } }
// クラスファイルをインクルード include("Serializer.php");
// オブジェクトを作成 $serializer = new XML_Serializer();
// シリアル化するオブジェクトを作成 $car = new Automobile; $ car->setAttributes("blue", 1982, "Mustang");
// XML 宣言を追加 $serializer->setOption("addDecl", true);
// 要素をインデント $serializer-> ;setOption("indent", " ");
// ルート要素の名前を設定します $serializer->setOption("rootName", "car");
// シリアル化を実行します $result = $serializer- >serialize($car);
// 結果コードをチェックし、成功した場合は XML を表示します if($result === true) { echo $serializer->getSerializedData(); }
?>
この例では、最初に Automobile というクラスを定義し、そのためのメソッドとプロパティをいくつか作成しました。次に、スクリプトのさらに下で、クラスのオブジェクトをインスタンス化し、オブジェクトのプロパティに非常に具体的な値を設定しました。このオブジェクトは XML_Serializer の Serialize() メソッドによってシリアル化されました。
結果は次のとおりです:
blue 1982 Mustang
| PHP を使用した XML のシリアル化 | ネストされた XML の構築XML_Serializer を使用した PHP データ構造からのドキュメント
|
|私のタイプではありません |
XML_Serializer の他の興味深い機能の 1 つは、XML ドキュメント内の各値とともにデータ型情報を保存できる機能です。 「型ヒント」と呼ばれるこのデータ型情報は、整数 6 と文字列「6」を区別するのに役立ち、XML アプリケーションが厳密に型指定されている場合に役立ちます。
型ヒントを有効にするには、単に「typeHints」オプションを true に設定します。次の例は次のことを示しています:
// include class file include("Serializer.php");
// set options $options = array( "addDecl" => true, "indent" => ; " ", "rootName" => "car", "typeHints" => true);
// オブジェクト $serializer = new XML_Serializer($options);
// 配列を作成car = array("color" => "blue", "year" => 1982, "model" => "Mustang", "price" => 15000.00);
// シリアル化を実行します $result = $serializer->serialize($car);
// 結果コードをチェックし、成功した場合は XML を表示します if($result === true) { echo $serializer->getSerializedData(); } ?>
型ヒントを有効にすると、XML ドキュメント内のすべての要素に、その中に含まれる値のデータ型を示す追加の属性が付加されます。上記の例の出力は次のようになります:
blue 1982 Mustang 15000
上記の例では、シリアライザー オプションを設定するために少し異なる方法を使用していることに注意してください。オプションと値の配列を作成し、その配列をオブジェクト コンストラクターに渡します。設定するオプションが多数ある場合、この方法を使用するとコードを数行節約できます。
|
PHP を使用した XML のシリアル化 | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
| Traveling In Reverse |
良いことには 2 つの要素があります - ミッキーとドナルド、トムとジェリー、陰と陽 - したがって、XML_Serializer に独自のドッペルゲンガーがあるのも不思議ではありません。 XML_Unserializer と呼ばれるこのクラスは、XML ドキュメントを受け取り、それを PHP スクリプトでの使用に適した一連のネストされた PHP 構造に変換できます。
これがどのように機能するかを理解するために、次の XML ドキュメントを考慮してください:
アーサー・コナン・ドイル 24.95 ヤン・マーテル 7.99 Lonely Planet 16.99
さて、この XML ドキュメントを PHP 構造に変換するには、XML_Unserializer を実行するだけです。以下のように:
// クラスファイルをインクルード include("Unserializer.php");
// オブジェクトを作成 $unserializer = &new XML_Unserializer();
// ドキュメントをシリアル化解除する $result = $unserializer ->unserialize("library.xml", true);
// 結果をダンプします $data = $unserializer->getUnserializedData(); print_r($data);
?>
ここで、 unserialize() メソッドは XML データを含む文字列またはXML ファイル (どちらを渡すかに応じて 2 番目の引数を false または true に設定します) を返し、XML ドキュメントを表す PHP 構造を返します。出力は次のようになります:
Array ( [book] => Array ( [0] => Array ( [タイトル] => シャーロック・ホームズの冒険 [著者] = > アーサー・コナン・ドイル [価格] => )
[1] => [タイトル] => パイの生涯 [著者] => ヤン・マーテル [価格] = > 7.99 )
[2] => 配列 ( [タイトル] => 窮乏のヨーロッパ [著者] => ロンリープラネット [価格] => 16.99 )
) )
さて、(たとえば) 3 冊目の本のタイトルにアクセスするには、
$data['book'][2]['title'];
という表記を使用します。 XML_Unserializer はシリアル化プロセスで生成された型ヒントを使用して、XML 要素を PHP データ型に正確にマッピングすることに注意してください。これらのヒントが利用できない場合 (上記の例のように)、XML_Unserializer は各値の型を「推測」します。クラスのソースコードを見ると、「複雑な構造は配列になり、CData だけが含まれるタグは文字列になります。」
| | PHP で XML をシリアル化する | ネストされた XML ドキュメントを構築するXML_Serializer を使用した PHP データ構造からの変換
|
|シンプルに保つ |
アンシリアライザーに適切なオプションを設定するだけで、ネストされた配列のセットではなく、XML ドキュメントを PHP オブジェクトに変換することもできます。これがどのように行われるかを示す次の例を考えてみましょう:
// include class file include("Unserializer.php");
// アンシリアライザーにオブジェクトを作成するように指示します $options = array(" complexType" => "object");
// オブジェクトを作成します $unserializer = &new XML_Unserializer($options);
// ドキュメントをシリアル化解除します $result = $unserializer->unserialize("library.xml" 、 真実);
// 結果をダンプします print_r($unserializer->getUnserializedData());
?>
出力は次のとおりです:
stdClass Object ( [book] => Array ( [0] => stdClass オブジェクト ( [タイトル] => シャーロック・ホームズの冒険 [著者] => アーサー・コナン・ドイル [価格] => 24.95 )
[1] => stdClass オブジェクト ( [タイトル] => パイの生涯 [著者] => ヤン・マーテル [価格] =& gt; 7.99 )
[2] => stdClass オブジェクト ( [タイトル] = > ギリギリのヨーロッパ [著者] => [価格] =>99 )
)
この形式では、標準のオブジェクト表記法を使用してアクセスできます (たとえば)最後の本のタイトル - 表記
$obj->book[2]->title
は
Europe on a Shoestring
|
|
|
PHP を使用した XML のシリアル化 | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
|雇用の選択肢 |
さて、これはすべて素晴らしいことではありますが、この新たに発見した知識をすべて何か実用的なことに使用してみてはいかがでしょうか?
この次の例はまさにそれを行い、XML_Serializer クラスを使用して MySQL データベースに格納されているデータを変換する方法を示しています。 XML ドキュメントに変換し、後で使用できるようにファイルに書き込みます。これが私が使用する MySQL テーブルです
mysql> SELECT * FROM 従業員; +-----+----------+--------+-----+-----+-------- --------+--------+ | ID | l 名前 | fname |年齢 |セックス |部門 |国 | +-----+----------+----------+-----+-----+---------- -------+--------+ | 54 |ドエ |ジョン | 27 | M |エンジニアリング |米国 | | 127 |ジョーンズ |スー | 31 | F |財務 |イギリス | | 113 |ウー |デビッド | 26 | M |管理 | CN | | 175 |トーマス |ジェームス | 34 | M |財務 |米国 | | 168 |ケント |ジェーン | 29 | F |管理 |米国 | | 12 |カマス |ラヴィナ | 35 | F |財務 | IN | +-----+--------+--------+-----+-----+---------- ------+--------+ 6 行セット (0.11 秒)
そして、ターゲット XML ドキュメントを次のようにします:
Doe John 27 M Engineering US Jones Sue 31 F 財務 UK Woo David 26 M 管理 CN Thomas James 34 M 財務 US Kent Jane 29 F Administration US カマス Ravina 35 F Finance IN
XML_Serializer を使用すると、これを数行のコードで実現できます。
// include class file include("Serializer.php");
// 出力ファイル名を設定 $filename = 'employees.xml';
// オプションを設定 $options = array( "addDecl" => true, "defaultTagName" => "従業員", "indent" => " ", "rootName" => "従業員");
// オブジェクトを作成する $serializer = new XML_Serializer($options);
// データベースへの接続をオープンします $connection = mysql_connect("localhost", "user", "secret") or die ("接続できません!");
// データベースを選択します mysql_select_db("db1") または die ("データベースを選択できません!");
// クエリを実行します $query = "SELECT * FROM 従業員"; $result = mysql_query($query) またはdie ("クエリのエラー: $query. " . mysql_error());
// 行を反復処理して列データを出力します while ($row = mysql_fetch_array($result)) { $xml[] = array ( "lname" => $row[1], "fname" => $row[2], "年齢" => 、 「部門」=> $row[5], "国" => $row[6]); }
// データベース接続を閉じる mysql_close($connection);
// シリアル化を実行する $result = $serializer->serialize($xml);
// ファイルを開く if (!$handle = fopen($filename, 'w')) { print "ファイル ($filename) を開けません"; exit; }
// XML をファイルに書き込みます if (!fwrite( $handle, $serializer->getSerializedData())) { print "ファイル ($filename) に書き込めません"; exit; }
// ファイルを閉じる fclose($handle);
?> ;
仕組みがわかれば非常に簡単です。まず、データベースへの接続を開き、テーブルからすべてのレコードを取得しました。次に、新しいドキュメント ツリーをインスタンス化し、結果セットを反復処理し、反復ごとに新しいノードのセットをツリーに追加しました。最後に、すべての行が処理されると、動的に生成されたツリーが後で使用できるようにファイルに書き込まれます。
| PHP による XML のシリアル化 | XML_Serializer を使用して PHP データ構造からネストされた XML ドキュメントを構築する
|
|リンクアウト |
そしてこの記事はここまでです。最後の数ページでは、PHP ビルドが XML DOM をサポートしていない場合でも、PEAR の無料アドオン XML_Serializer クラスを使用して XML ドキュメント ツリーを構築する方法を説明しました。配列またはオブジェクトから XML ドキュメントをプログラムで作成する方法、XML ドキュメント ノードをインデントする方法、要素に属性を付加する方法、およびシリアライザーの動作をカスタマイズする方法を説明しました。また、XML ドキュメントを PHP スクリプト内で使用するために PHP 配列またはオブジェクトにリバースシリアル化する方法と、これをより正確なプロセスにするためにタイプ ヒントがどのように役立つかについての例も示しました。最後に、このコードすべての実践的な実際の使用法を示す複合サンプルで締めくくりました。これは、MySQL データベース内のデータを XML に変換し、ファイルに書き込むというものです。
もちろん、これはすべて、氷山の一角 - このようなパワーを自由に使えば、無限の可能性が広がります。 XML と PHP を使用して他に何ができるかを確認するには、次のリンクにアクセスすることをお勧めします:
XML Basics (http://www.melonfire.com/community/columns/trog/article.php?) id=78
XSL の基本 (http://www.melonfire.com/community/columns/trog/article.php?id=82
XML での PHP の使用) (http://www.melonfire.com/) Community/columns/trog/article.php?id=71
PHP と Sablotron による XSLT 変換 (http://www.melonfire.com/community/columns/trog/article.php?id=97
XML の構築) Trees With PHP (http://www.melonfire.com/community/columns/trog/article.php?id=180)
XML と PHP の本 (http://www.xmlphp.com/
Till)次回は…頑張ってください! | |
|
|
|
|
|