SimpleXML拡張モジュールは、
XMLをオブジェクトにとても簡単かつ容易に変換するための機能を
提供します。変換後のオブジェクトでは、
通常のプロパティセレクタや配列反復子を用いて処理を行うことが
可能です。
SimpleXML 拡張モジュールは PHP 5 が必要になります。
SimpleXML 拡張モジュールは、デフォルトで利用可能です。
この機能を無効にするには、
--disable-simplexml
コンフィギュアオプションを使用してください。
このリファレンスの多くの例ではXML文字列を必要とします。各例で
この文字列をくり返す代わりに、あるファイルにこの文字列を保存して、
各例で読みこむことにします。この読みこまれるファイルは、以下の例
に関するセクションで使用されます。
もしくは、XMLドキュメントを作成し、
simplexml_load_file() により読みこむことも
可能です。
例 1. XML文字列を設定するインクルードファイル example.php
<?php $xmlstr = <<<XML <?xml version='1.0' standalone='yes'?> <movies> <movie> <title>PHP: Behind the Parser</title> <characters> <character> <name>Ms. Coder</name> <actor>Onlivia Actora</actor> </character> <character> <name>Mr. Coder</name> <actor>El ActÓr</actor> </character> </characters> <plot> So, this language. It's like, a programming language. Or is it a scripting language? All is revealed in this thrilling horror spoof of a documentary. </plot> <rating type="thumbs">7</rating> <rating type="stars">5</rating> </movie> </movies> XML; ?>
|
|
SimpleXMLの容易さが最も明確に現われるのは、
簡単なXMLドキュメントから文字列または数字を展開する時です。
例 2. <plot> を取得する
<?php include 'example.php';
$xml = new SimpleXMLElement($xmlstr);
echo $xml->movie[0]->plot; // "So this language. It's like..." ?>
|
|
例 3. SimpleXMLでユニークでない要素にアクセスする
単一の親要素の子要素としてある要素のインスタンスが複数存在する時、
通常の反復処理を適用することができます。
<?php include 'example.php';
$xml = new SimpleXMLElement($xmlstr);
/* 個々の <movie> ノードに対して、<plot> を分割して表示します */ foreach ($xml->movie as $movie) { echo $movie->plot, '<br />'; }
?>
|
|
例 4. 属性を使用する
ここまでは、要素の名前と値を読む方法のみを扱って来ました。
SimpleXMLは要素の属性にアクセスすることも可能です。
要素の属性にアクセスする方法は、配列 の要素に
アクセスするのと全く同じです。
<?php include 'example.php';
$xml = new SimpleXMLElement($xmlstr);
/* 最初の映画の <rating> ノードにアクセスします。 * また、その評価も出力します。*/ foreach ($xml->movie[0]->rating as $rating) { switch((string) $rating['type']) { // 要素のインデックスとして、属性を取得します case 'thumbs': echo $rating, ' thumbs up'; break; case 'stars': echo $rating, ' stars'; break; } } ?>
|
|
例 5. 要素および属性をテキストと比較する
要素または属性を文字列と比較する、もしくは、文字列を引数とする関数に
渡すには、(string) により文字列にキャストする
必要があります。さもないと、PHPはこの要素をオブジェクトとして扱います。
<?php include 'example.php';
$xml = new SimpleXMLElement($xmlstr);
if ((string) $xml->movie->title == 'PHP: Behind the Parser') { print 'My favorite movie.'; }
htmlentities((string) $xml->movie->title); ?>
|
|
例 6. XPath の使用
SimpleXML は、XPath を標準でサポートしています。
<character> 要素を全て見つけるには、
以下のようにします。
<?php include 'example.php'; $xml = new SimpleXMLElement($xmlstr);
foreach ($xml->xpath('//character') as $character) { echo $character->name, 'played by ', $character->actor, '<br />'; } ?>
|
'//' はワイルドカードとして動作します。絶対パスを指定するには、
スラッシュを一つだけにします。
|
例 7. 値を設定する
SimpleXMLの中のデータは、定数とすることができません。
オブジェクトは、その全ての要素について変更が可能です。
<?php include 'example.php'; $xml = new SimpleXMLElement($xmlstr);
$xml->movie[0]->characters->character[0]->name = 'Miss Coder';
echo $xml->asXML(); ?>
|
上のコードは、元のXMLドキュメントと全く同じXMLドキュメントを新規に
出力しますが、新しいXMLファイルでは、Ms. Coder が Miss Coder
に変更されているところが異なります。
|
例 8. 要素と属性を追加する
PHP 5.1.3 以降では、SimpleXML を使用して簡単に子要素および属性を追加することができます。
<?php include 'example.php'; $xml = new SimpleXMLElement($xmlstr);
$character = $xml->movie[0]->characters->addChild('character'); $character->addChild('name', 'Mr. Parser'); $character->addChild('actor', 'John Doe');
$rating = $xml->movie[0]->addChild('rating', 'PG'); $rating->addAttribute('type', 'mpaa');
echo $xml->asXML(); ?>
|
上のコードは、元と同じオブジェクトを出力しますが、
そこに新しいキャラクターと評価が追加されています。
|
例 9. DOMとの相互運用性
PHPは、SimpleXML形式とDOM形式の間でXMLノードを変換する機構を有しています。
この例では、DOM要素をSimpleXMLに変換することができます。
<?php $dom = new domDocument; $dom->loadXML('<books><book><title>blah</title></book></books>'); if (!$dom) { echo 'Error while parsing the document'; exit; }
$s = simplexml_import_dom($dom);
echo $s->book[0]->title; ?>
|
|