&reftitle.examples;
基本的な SimpleXML の使用法 このリファレンスの多くの例では XML 文字列が必要です。それぞれの例で この文字列をくり返す代わりに、あるファイルにこの文字列を保存して、 例ごとに読みこむことにします。この読みこまれるファイルは、以下の例 に関するセクションで使います。 もしくは、XMLドキュメントを作成し、 simplexml_load_file により読みこむことも 可能です。 XML 文字列を設定するインクルードファイル examples/simplexml-data.php PHP: Behind the Parser Ms. Coder Onlivia Actora Mr. Coder El ActÓr 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. PHP solves all my web problems 7 5 XML; ?> ]]> SimpleXML の容易さが最も明確に現われるのは、 簡単な XML ドキュメントから文字列または数字を展開する時です。 Getting <literal><plot></literal> movie[0]->plot; ?> ]]> &example.outputs; XML ドキュメント内の要素のうち、PHP の命名規約で許可されていない文字 (たとえばハイフンなど) を含む名前のものにアクセスするには、 要素名を括弧とアポストロフィで囲みます。 <literal><line></literal> を取得する movie->{'great-lines'}->line; ?> ]]> &example.outputs; SimpleXML でユニークでない要素にアクセスする 単一の親要素の子要素としてある要素のインスタンスが複数存在する時、 通常の反復処理を適用することができます。 ノードに対して、 を分割して表示します */ foreach ($movies->movie->characters->character as $character) { echo $character->name, ' played by ', $character->actor, PHP_EOL; } ?> ]]> &example.outputs; プロパティ (先ほどの例の $movies->movie) は配列ではありません。反復処理 と 配列形式でのアクセス ができるオブジェクトです。 属性を使用する ここまでは、要素の名前と値を読む方法のみを扱って来ました。 SimpleXML は要素の属性にアクセスすることも可能です。 要素の属性にアクセスする方法は、array の要素に アクセスするのと全く同じです。 ノードにアクセスします。 * また、その評価も出力します。*/ foreach ($movies->movie[0]->rating as $rating) { switch((string) $rating['type']) { // Get attributes as element indices case 'thumbs': echo $rating, ' thumbs up'; break; case 'stars': echo $rating, ' stars'; break; } } ?> ]]> &example.outputs; 要素および属性をテキストと比較する 要素または属性を文字列と比較する、もしくは、文字列を引数とする関数に 渡すには、(string) により文字列にキャストする 必要があります。さもないと、PHP はこの要素をオブジェクトとして扱います。 movie->title == 'PHP: Behind the Parser') { print 'My favorite movie.'; } echo htmlentities((string) $movies->movie->title); ?> ]]> &example.outputs; ふたつの要素の比較 たとえ同一の要素を指していたとしても 2 つの SimpleXMLElements は異なるものと見なされます。 ]]> &example.outputs; XPath の使用 SimpleXML は、XPath を標準でサポートしています。 <character> 要素をすべて見つけるには、 以下のようにします。 '//' は、ワイルドカードとして機能します。 完全なパスを指定するには、スラッシュをひとつ省略します: xpath('//character') as $character) { echo $character->name, ' played by ', $character->actor, PHP_EOL; } ?> ]]> &example.outputs; 値を設定する SimpleXMLの中のデータは、定数とすることができません。 オブジェクトは、その全ての要素について変更が可能です。 movie[0]->characters->character[0]->name = 'Miss Coder'; echo $movies->asXML(); ?> ]]> &example.outputs; PHP: Behind the Parser Miss Coder Onlivia Actora Mr. Coder El ActÓr 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. PHP solves all my web problems 7 5 ]]> 要素と属性を追加する SimpleXML を使用して簡単に子要素および属性を追加することができます。 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(); ?> ]]> &example.outputs; PHP: Behind the Parser Ms. Coder Onlivia Actora Mr. Coder El ActÓr Mr. ParserJohn Doe 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. PHP solves all my web problems 7 5 PG ]]> DOM との相互運用性 PHP は、SimpleXML 形式と DOM 形式の間で XML ノードを変換する機構を有しています。 この例では、DOM 要素を SimpleXML に変換することができます。 loadXML('blah'); if (!$dom) { echo 'Error while parsing the document'; exit; } $books = simplexml_import_dom($dom); echo $books->book[0]->title; ?> ]]> &example.outputs; 名前空間を扱う Onlivia Actora XML; $movies = simplexml_load_string($data); // 名前空間 http://www.w3.org/XML/1998/namespace は、"xml" として利用できます echo $movies->movie->attributes("xml", true)["id"] . "\n"; // 名前空間付きの属性は attributes() でアクセスできます。 echo $movies->movie->attributes("a", true)["link"] . "\n"; // Using namespace URI allows document to use any namespace alias. // 名前空間URI を使うと、ドキュメントを任意の名前空間のエイリアスとして使えます echo $movies->movie->attributes("http://a")["link"] . "\n"; // 子要素は children() を使ってアクセスできます echo $movies->movie->children("http://a")->actor . "\n"; // 名前空間付きで xpath() を使うには、名前空間をまず登録する必要があります $movies->registerXPathNamespace("a", "http://a"); echo count($movies->xpath("//a:actor")) . "\n"; // デフォルトの名前空間であっても、登録が必要です $movies->registerXPathNamespace("default", "http://default"); echo count($movies->xpath("//default:movie")) . "\n"; // この結果は空になります echo count($movies->xpath("//movie")) . "\n"; ?> ]]>
XML エラーの対応 ドキュメント読み込み時の XML エラーに対処するのは非常にシンプルな作業です。 libxml の機能を使うと、 ドキュメント読み込み時のすべての XML エラーを抑制して後からそれを処理することができます。 libxml_get_errors が返す LibXMLError オブジェクトには、エラーについての message や line、 column (場所) といったプロパティが含まれます。 壊れた XML 文字列の読み込み "); if ($sxe === false) { echo "Failed loading XML\n"; foreach(libxml_get_errors() as $error) { echo "\t", $error->message; } } ?> ]]> &example.outputs; ' expected Opening and ending tag mismatch: xml line 1 and broken Premature end of data in tag broken line 1 ]]>
&reftitle.seealso; libxml_use_internal_errors libxml_get_errors