基本的な 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> <great-lines> <line>PHP solves all my web problems</line> </great-lines> <rating type="thumbs">7</rating> <rating type="stars">5</rating> </movie></movies>XML;?>
SimpleXML の容易さが最も明確に現われるのは、 簡単な XML ドキュメントから文字列または数字を展開する時です。
例2 <plot>
を取得する
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);echo $movies->movie[0]->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.
XML ドキュメント内の要素のうち、PHP の命名規約で許可されていない文字 (たとえばハイフンなど) を含む名前のものにアクセスするには、 要素名を括弧とアポストロフィで囲みます。
例3 <line>
を取得する
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);echo $movies->movie->{'great-lines'}->line;?>
上の例の出力は以下となります。
PHP solves all my web problems
例4 SimpleXML でユニークでない要素にアクセスする
単一の親要素の子要素としてある要素のインスタンスが複数存在する時、 通常の反復処理を適用することができます。
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);/* 個々の <character> ノードに対して、<name> を分割して表示します */foreach ($movies->movie->characters->character as $character) { echo $character->name, ' played by ', $character->actor, PHP_EOL;}?>
上の例の出力は以下となります。
Ms. Coder played by Onlivia Actora Mr. Coder played by El ActÓr
注意:
プロパティ (先ほどの例の
$movies->movie
) は配列ではありません。反復処理 と 配列形式でのアクセス ができるオブジェクトです。
例5 属性を使用する
ここまでは、要素の名前と値を読む方法のみを扱って来ました。 SimpleXML は要素の属性にアクセスすることも可能です。 要素の属性にアクセスする方法は、配列 の要素に アクセスするのと全く同じです。
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);/* 最初の映画の <rating> ノードにアクセスします。 * また、その評価も出力します。*/foreach ($movies->movie[0]->rating as $rating) { switch((string) $rating['type']) { // 要素のインデックスとして、属性を取得します case 'thumbs': echo $rating, ' thumbs up'; break; case 'stars': echo $rating, ' stars'; break; }}?>
上の例の出力は以下となります。
7 thumbs up5 stars
例6 要素および属性をテキストと比較する
要素または属性を文字列と比較する、もしくは、文字列を引数とする関数に
渡すには、(string)
により文字列にキャストする
必要があります。さもないと、PHP はこの要素をオブジェクトとして扱います。
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);if ((string) $movies->movie->title == 'PHP: Behind the Parser') { print 'My favorite movie.';}echo htmlentities((string) $movies->movie->title);?>
上の例の出力は以下となります。
My favorite movie.PHP: Behind the Parser
例7 ふたつの要素の比較
PHP 5.2.0 以降、たとえ同一の要素を指していたとしても 2 つの SimpleXMLElements は異なるものと見なされます。
<?phpinclude 'example.php';$movies1 = new SimpleXMLElement($xmlstr);$movies2 = new SimpleXMLElement($xmlstr);var_dump($movies1 == $movies2); // PHP 5.2.0 以降では false?>
上の例の出力は以下となります。
bool(false)
例8 XPath の使用
SimpleXML は、XPath を標準でサポートしています。
<character>
要素をすべて見つけるには、
以下のようにします。
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);foreach ($movies->xpath('//character') as $character) { echo $character->name, ' played by ', $character->actor, PHP_EOL;}?>
'//
' はワイルドカードとして動作します。絶対パスを指定するには、
スラッシュを一つだけにします。
上の例の出力は以下となります。
Ms. Coder played by Onlivia Actora Mr. Coder played by El ActÓr
例9 値を設定する
SimpleXMLの中のデータは、定数とすることができません。 オブジェクトは、その全ての要素について変更が可能です。
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);$movies->movie[0]->characters->character[0]->name = 'Miss Coder';echo $movies->asXML();?>
上の例の出力は以下となります。
<?xml version="1.0" standalone="yes"?> <movies> <movie> <title>PHP: Behind the Parser</title> <characters> <character> <name>Miss 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> <great-lines> <line>PHP solves all my web problems</line> </great-lines> <rating type="thumbs">7</rating> <rating type="stars">5</rating> </movie> </movies>
例10 要素と属性を追加する
PHP 5.1.3 以降では、SimpleXML を使用して簡単に子要素および属性を追加することができます。
<?phpinclude 'example.php';$movies = new SimpleXMLElement($xmlstr);$character = $movies->movie[0]->characters->addChild('character');$character->addChild('name', 'Mr. Parser');$character->addChild('actor', 'John Doe');$rating = $movies->movie[0]->addChild('rating', 'PG');$rating->addAttribute('type', 'mpaa');echo $movies->asXML();?>
上の例の出力は以下となります。
<?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> <character><name>Mr. Parser</name><actor>John Doe</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> <great-lines> <line>PHP solves all my web problems</line> </great-lines> <rating type="thumbs">7</rating> <rating type="stars">5</rating> <rating type="mpaa">PG</rating></movie> </movies>
例11 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;}$books = simplexml_import_dom($dom);echo $books->book[0]->title;?>
上の例の出力は以下となります。
blah