<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 15998 -->
<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>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
