<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.config.adapters.xml">
    <title>Zend_Config_Xml(日本語)</title>
    <para>
        <classname>Zend_Config_Xml</classname> を使用すると、シンプルな <acronym>XML</acronym>
        形式で保存した設定データを、オブジェクトのプロパティとして扱えるようになります。
        <acronym>XML</acronym> ファイルあるいは文字列のルート要素は設定には関係しないので、
        任意の名前がつけられます。
        その直下のレベルの <acronym>XML</acronym> 要素が設定データのセクションに対応します。
        セクションレベルの要素の下に <acronym>XML</acronym> 要素を配置することで、
        階層構造をサポートします。
        末端レベルの <acronym>XML</acronym> 要素が設定データの値に対応します。
        セクションの継承は、<acronym>XML</acronym> の属性 <emphasis>extends</emphasis>
        でサポートされます。この属性の値が、
        データを継承しているセクション名を表します。
    </para>
    <note>
        <title>返り値の型</title>
        <para>
            <classname>Zend_Config_Xml</classname> で読み込んだ設定データは、
            常に文字列形式で返されます。必要に応じて、
            文字列から適切な型に変換してください。
        </para>
    </note>
    <example id="zend.config.adapters.xml.example.using">
        <title>Zend_Config_Xml の使用法</title>
        <para>
            この例は、<classname>Zend_Config_Xml</classname> を使用して
            <acronym>XML</acronym> ファイルから設定データを読み込むための基本的な方法を説明するものです。
            この例では、運用環境の設定と開発環境の設定を両方管理しています。
            開発環境用の設定データは運用環境用のものと非常に似ているので、
            開発環境用のセクションは運用環境用のセクションを継承させています。
            今回の場合なら、逆に運用環境用のセクションを開発環境用のものから継承させてもいいでしょう。
            そうしたからといって特に状況が複雑になるわけではありません。
            ここでは、次のような内容の設定データが
            <filename>/path/to/config.xml</filename> に存在するものとします。
        </para>
        <programlisting language="xml"><![CDATA[
<?xml version="1.0"?>
<configdata>
    <production>
        <webhost>www.example.com</webhost>
        <database>
            <adapter>pdo_mysql</adapter>
            <params>
                <host>db.example.com</host>
                <username>dbuser</username>
                <password>secret</password>
                <dbname>dbname</dbname>
            </params>
        </database>
    </production>
    <staging extends="production">
        <database>
            <params>
                <host>dev.example.com</host>
                <username>devuser</username>
                <password>devsecret</password>
            </params>
        </database>
    </staging>
</configdata>
]]></programlisting>
        <para>
            次に、開発者が開発環境用の設定データを <acronym>XML</acronym> ファイルから読み込むことを考えます。
            これは簡単なことで、単に <acronym>XML</acronym> ファイルとセクションを指定するだけです。
        </para>
        <programlisting language="php"><![CDATA[
$config = new Zend_Config_Xml('/path/to/config.xml', 'staging');

echo $config->database->params->host;   // "dev.example.com" と出力します
echo $config->database->params->dbname; // "dbname" と出力します
]]></programlisting>
    </example>
    <example id="zend.config.adapters.xml.example.attributes">
        <title>Zend_Config_Xml におけるタグの属性の使用</title>
        <para>
            <classname>Zend_Config_Xml</classname> では、設定内でノードを定義する際にさらに 2 通りの方法を用意しています。
            どちらも属性を使用するものです。<emphasis>extends</emphasis> 属性や
            <emphasis>value</emphasis> 属性は予約語
            (後者は、属性を使う 2 番目の方法で使用します)
            となり、使用できません。属性を使用する方法のひとつは、
            親ノードに属性を追加するものです。
            これが、そのノードの子と見なされます。
        </para>
        <programlisting language="xml"><![CDATA[
<?xml version="1.0"?>
<configdata>
    <production webhost="www.example.com">
        <database adapter="pdo_mysql">
            <params host="db.example.com" username="dbuser" password="secret" dbname="dbname"/>
        </database>
    </production>
    <staging extends="production">
        <database>
            <params host="dev.example.com" username="devuser" password="devsecret"/>
        </database>
    </staging>
</configdata>
]]></programlisting>
        <para>
            もうひとつの方法は、設定ファイルの記述量を減らすことはありません。
            ただ、同じタグ名を何度も書く必要がなくなるので保守性は上がります。
            単純に空のタグを作成し、その値を <emphasis>value</emphasis>
            属性に含めます。
        </para>
        <programlisting language="xml"><![CDATA[
<?xml version="1.0"?>
<configdata>
    <production>
        <webhost>www.example.com</webhost>
        <database>
            <adapter value="pdo_mysql"/>
            <params>
                <host value="db.example.com"/>
                <username value="dbuser"/>
                <password value="secret"/>
                <dbname value="dbname"/>
            </params>
        </database>
    </production>
    <staging extends="production">
        <database>
            <params>
                <host value="dev.example.com"/>
                <username value="devuser"/>
                <password value="devsecret"/>
            </params>
        </database>
    </staging>
</configdata>
]]></programlisting>
    </example>
<note>
        <title>XML 文字列</title>
        <para>
            <classname>Zend_Config_Xml</classname> は、データベースなどから取得した
            <acronym>XML</acronym> 文字列を直接読み込むこともできます。
            文字列はコンストラクタの最初のパラメータとして渡し、最初は
            <emphasis>'&lt;?xml'</emphasis> で始まらなければなりません。
        </para>
        <programlisting language="xml"><![CDATA[
$string = <<<EOT
<?xml version="1.0"?>
<config>
    <production>
        <db>
            <adapter value="pdo_mysql"/>
            <params>
                <host value="db.example.com"/>
            </params>
        </db>
    </production>
    <staging extends="production">
        <db>
            <params>
                <host value="dev.example.com"/>
            </params>
        </db>
    </staging>
</config>
EOT;

$config = new Zend_Config_Xml($string, 'staging');
]]></programlisting>
    </note>
<note>
        <title>Zend_Config XML 名前空間</title>
        <para>
            <classname>Zend_Config</classname> は独自の <acronym>XML</acronym>
            名前空間を持っており、パース処理に機能を追加できます。
            これを使用するには、名前空間 <acronym>URI</acronym>
            <filename>http://framework.zend.com/xml/zend-config-xml/1.0/</filename>
            をルートノードで定義しなければなりません。
        </para>

        <para>
            この名前空間を有効にすると、<acronym>PHP</acronym>
            の定数を設定ファイル内で使用できるようになります。
            <emphasis>extends</emphasis> 属性が新しい名前空間に移動し、
            <constant>NULL</constant> 名前空間では非推奨となります。
            これは、Zend Framework 2.0 で完全に削除される予定です。
        </para>
        <programlisting language="xml"><![CDATA[
$string = <<<EOT
<?xml version="1.0"?>
<config xmlns:zf="http://framework.zend.com/xml/zend-config-xml/1.0/">
    <production>
        <includePath>
            <zf:const zf:name="APPLICATION_PATH"/>/library</includePath>
        <db>
            <adapter value="pdo_mysql"/>
            <params>
                <host value="db.example.com"/>
            </params>
        </db>
    </production>
    <staging zf:extends="production">
        <db>
            <params>
                <host value="dev.example.com"/>
            </params>
        </db>
    </staging>
</config>
EOT;

define('APPLICATION_PATH', dirname(__FILE__));
$config = new Zend_Config_Xml($string, 'staging');

echo $config->includePath; // "/var/www/something/library" と表示します
]]></programlisting>
    </note>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
