<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<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> поддерживает иерархическую организацию данных через вложенность
        элементов ниже элементов уровня разделов. Содержимое конечного элемента
        соответствует значению элемента конфигурационных данных. Наследование
        разделов поддерживается через специальный атрибут <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>. В этом примере
            используются конфигурационные данные для производственной и
            промежуточной систем. Поскольку конфигурационные данные
            промежуточной системы очень похожи на конфигурационные данные для
            производственной системы, то "промежуточный" (staging) раздел наследует от
            "производственного" (production) раздела. В данном случае выбор
            произвольный, т.е. может быть и наоборот — "производственный"
            раздел наследует от "промежуточного", хотя это может не подходить в
            более сложных случаях. Допустим, конфигурационные данные
            находятся в файле <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>
]]></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>Использование тегов в <classname>Zend_Config_Xml</classname></title>
        <para>
            <classname>Zend_Config_Xml</classname> также поддерживает два дополнительных способа
            определения узлов в конфигурации. В обоих способах используются
            атрибуты. Поскольку атрибуты <emphasis>extends</emphasis> и
            <emphasis>value</emphasis> являются зарезервированными ключевыми словами
            (<emphasis>value</emphasis> используется во втором способе
            с применением атрибутов), то они не должны использоваться здесь.
            Первый способ с использованием атрибутов состоит в добавлении
            атрибутов в родительский узел, они потом будут преобразованы в
            потомки этого узла:
        </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:
-->
