CXLIV. SimpleXML関数

導入

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&#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>
  <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;
?>

目次
SimpleXMLElement->addAttribute() --  SimpleXML 要素に属性を追加する
SimpleXMLElement->addChild() --  XML ノードに子要素を追加する
SimpleXMLElement->asXML() --  SimpleXML 要素に基づき整形式の XML 文字列を返す
SimpleXMLElement->attributes() --  要素の属性を定義する
SimpleXMLElement->children() --  指定したノードの子ノードを見付ける
SimpleXMLElement->__construct() --  新しい SimpleXMLElement オブジェクトを作成する
SimpleXMLElement->getDocNamespaces() --  ドキュメントで宣言されている名前空間を返す
SimpleXMLElement->getName() -- XML 要素の名前を取得する
SimpleXMLElement->getNamespaces() --  ドキュメントで使用している名前空間を返す
SimpleXMLElement->registerXPathNamespace() --  次の XPath クエリ用の prefix/ns コンテキストを作成する
SimpleXMLElement->xpath() --  XMLデータにXpathクエリを実行する
simplexml_import_dom --  DOMノードからSimpleXMLElementオブジェクトを取得する
simplexml_load_file --  XMLファイルをパースし、オブジェクトに代入する
simplexml_load_string --  XML文字列をオブジェクトに代入する