基本的な 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&#211;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> を取得する

<?php
include '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> を取得する

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie->{'great-lines'}->line;
?>

上の例の出力は以下となります。

PHP solves all my web problems

例4 SimpleXML でユニークでない要素にアクセスする

単一の親要素の子要素としてある要素のインスタンスが複数存在する時、 通常の反復処理を適用することができます。

<?php
include '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 は要素の属性にアクセスすることも可能です。 要素の属性にアクセスする方法は、配列 の要素に アクセスするのと全く同じです。

<?php
include '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 はこの要素をオブジェクトとして扱います。

<?php
include '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 ふたつの要素の比較

たとえ同一の要素を指していたとしても 2 つの SimpleXMLElements は異なるものと見なされます。

<?php
include 'example.php';

$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2);
?>

上の例の出力は以下となります。

bool(false)

例8 XPath の使用

SimpleXML は、XPath を標準でサポートしています。 <character> 要素をすべて見つけるには、 以下のようにします。

<?php
include '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の中のデータは、定数とすることができません。 オブジェクトは、その全ての要素について変更が可能です。

<?php
include '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&#xD3;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 要素と属性を追加する

SimpleXML を使用して簡単に子要素および属性を追加することができます。

<?php
include '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&#xD3;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