mirror of
https://github.com/php/doc-ja.git
synced 2026-03-24 15:12:22 +01:00
544 lines
15 KiB
XML
544 lines
15 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: bdc3ab31fb7db217fe9418230a11d9d779ee65eb Maintainer: takagi Status: ready -->
|
|
<!-- CREDITS: shimooka,hirokawa -->
|
|
|
|
<chapter xml:id="simplexml.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
&reftitle.examples;
|
|
<section xml:id="simplexml.examples-basic">
|
|
<title>基本的な SimpleXML の使用法</title>
|
|
|
|
<para>
|
|
このリファレンスの多くの例では XML 文字列が必要です。それぞれの例で
|
|
この文字列をくり返す代わりに、あるファイルにこの文字列を保存して、
|
|
例ごとに読みこむことにします。この読みこまれるファイルは、以下の例
|
|
に関するセクションで使います。
|
|
もしくは、XMLドキュメントを作成し、
|
|
<function>simplexml_load_file</function> により読みこむことも
|
|
可能です。
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>XML 文字列を設定するインクルードファイル examples/simplexml-data.php</title>
|
|
<programlisting role="php" xml:id="simplexml.examples.movie">
|
|
<![CDATA[
|
|
<?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;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
SimpleXML の容易さが最も明確に現われるのは、
|
|
簡単な XML ドキュメントから文字列または数字を展開する時です。
|
|
<example>
|
|
<title>Getting <literal><plot></literal></title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
echo $movies->movie[0]->plot;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
|
|
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.
|
|
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
XML ドキュメント内の要素のうち、PHP の命名規約で許可されていない文字
|
|
(たとえばハイフンなど) を含む名前のものにアクセスするには、
|
|
要素名を括弧とアポストロフィで囲みます。
|
|
<example>
|
|
<title><literal><line></literal> を取得する</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
echo $movies->movie->{'great-lines'}->line;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
PHP solves all my web problems
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>SimpleXML でユニークでない要素にアクセスする</title>
|
|
<simpara>
|
|
単一の親要素の子要素としてある要素のインスタンスが複数存在する時、
|
|
通常の反復処理を適用することができます。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
/* 個々の <character> ノードに対して、<name> を分割して表示します */
|
|
foreach ($movies->movie->characters->character as $character) {
|
|
echo $character->name, ' played by ', $character->actor, PHP_EOL;
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
Ms. Coder played by Onlivia Actora
|
|
Mr. Coder played by El ActÓr
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<note>
|
|
<para>
|
|
プロパティ (先ほどの例の <literal>$movies->movie</literal>)
|
|
は配列ではありません。<link linkend="class.iterator">反復処理</link> と
|
|
<link linkend="class.arrayaccess">配列形式でのアクセス</link> ができるオブジェクトです。
|
|
</para>
|
|
</note>
|
|
<para>
|
|
<example>
|
|
<title>属性を使用する</title>
|
|
<simpara>
|
|
ここまでは、要素の名前と値を読む方法のみを扱って来ました。
|
|
SimpleXML は要素の属性にアクセスすることも可能です。
|
|
要素の属性にアクセスする方法は、<type>array</type> の要素に
|
|
アクセスするのと全く同じです。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
/* 最初の映画の <rating> ノードにアクセスします。
|
|
* また、その評価も出力します。*/
|
|
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;
|
|
}
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
7 thumbs up5 stars
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>要素および属性をテキストと比較する</title>
|
|
<simpara>
|
|
要素または属性を文字列と比較する、もしくは、文字列を引数とする関数に
|
|
渡すには、<literal>(string)</literal> により文字列にキャストする
|
|
必要があります。さもないと、PHP はこの要素をオブジェクトとして扱います。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
if ((string) $movies->movie->title == 'PHP: Behind the Parser') {
|
|
print 'My favorite movie.';
|
|
}
|
|
|
|
echo htmlentities((string) $movies->movie->title);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
My favorite movie.PHP: Behind the Parser
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>ふたつの要素の比較</title>
|
|
<simpara>
|
|
たとえ同一の要素を指していたとしても
|
|
2 つの SimpleXMLElements は異なるものと見なされます。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies1 = new SimpleXMLElement($xmlstr);
|
|
$movies2 = new SimpleXMLElement($xmlstr);
|
|
var_dump($movies1 == $movies2);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
bool(false)
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>XPath の使用</title>
|
|
<simpara>
|
|
SimpleXML は、<acronym>XPath</acronym> を標準でサポートしています。
|
|
<literal><character></literal> 要素をすべて見つけるには、
|
|
以下のようにします。
|
|
</simpara>
|
|
<simpara>
|
|
'<literal>//</literal>' は、ワイルドカードとして機能します。
|
|
完全なパスを指定するには、スラッシュをひとつ省略します:
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
foreach ($movies->xpath('//character') as $character) {
|
|
echo $character->name, ' played by ', $character->actor, PHP_EOL;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
Ms. Coder played by Onlivia Actora
|
|
Mr. Coder played by El ActÓr
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>値を設定する</title>
|
|
<simpara>
|
|
SimpleXMLの中のデータは、定数とすることができません。
|
|
オブジェクトは、その全ての要素について変更が可能です。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.php';
|
|
$movies = new SimpleXMLElement($xmlstr);
|
|
|
|
$movies->movie[0]->characters->character[0]->name = 'Miss Coder';
|
|
|
|
echo $movies->asXML();
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
<?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>
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>要素と属性を追加する</title>
|
|
<simpara>
|
|
SimpleXML を使用して簡単に子要素および属性を追加することができます。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
include 'examples/simplexml-data.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();
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
<?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>
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>DOM との相互運用性</title>
|
|
<simpara>
|
|
PHP は、SimpleXML 形式と DOM 形式の間で XML ノードを変換する機構を有しています。
|
|
この例では、DOM 要素を SimpleXML に変換することができます。
|
|
</simpara>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
blah
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>名前空間を扱う</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$data = <<<XML
|
|
<movies xmlns="http://default" xmlns:a="http://a">
|
|
<movie xml:id="movie1" a:link="IMDB">
|
|
<a:actor>Onlivia Actora</a:actor>
|
|
</movie>
|
|
</movies>
|
|
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";
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
</section>
|
|
|
|
<section xml:id="simplexml.examples-errors">
|
|
<title>XML エラーの対応</title>
|
|
<para>
|
|
ドキュメント読み込み時の XML エラーに対処するのは非常にシンプルな作業です。
|
|
<link linkend="book.libxml">libxml</link> の機能を使うと、
|
|
ドキュメント読み込み時のすべての XML エラーを抑制して後からそれを処理することができます。
|
|
</para>
|
|
<para>
|
|
<function>libxml_get_errors</function> が返す
|
|
<classname>LibXMLError</classname> オブジェクトには、エラーについての
|
|
<link linkend="libxmlerror.props.message">message</link> や
|
|
<link linkend="libxmlerror.props.line">line</link>、
|
|
<link linkend="libxmlerror.props.column">column</link> (場所)
|
|
といったプロパティが含まれます。
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>壊れた XML 文字列の読み込み</title>
|
|
<programlisting role="php" xml:id="simplexml.examples.error">
|
|
<![CDATA[
|
|
<?php
|
|
libxml_use_internal_errors(true);
|
|
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
|
|
if ($sxe === false) {
|
|
echo "Failed loading XML\n";
|
|
foreach(libxml_get_errors() as $error) {
|
|
echo "\t", $error->message;
|
|
}
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
Failed loading XML
|
|
Blank needed here
|
|
parsing XML declaration: '?>' expected
|
|
Opening and ending tag mismatch: xml line 1 and broken
|
|
Premature end of data in tag broken line 1
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<section role="seealso"><!-- {{{ -->
|
|
&reftitle.seealso;
|
|
<para>
|
|
<simplelist>
|
|
<member><function>libxml_use_internal_errors</function></member>
|
|
<member><function>libxml_get_errors</function></member>
|
|
<member><xref linkend="class.libxmlerror" /></member>
|
|
</simplelist>
|
|
</para>
|
|
</section>
|
|
</section>
|
|
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|