Загрузить файл PHP SimpleXML с нулевыми элементами

У меня есть следующий файл XML с именем «cookie_domain.xml» с содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<setting>
    <parameter>cookie_domain</parameter>
    <displayname>Cookie Domain</displayname>
    <grouping>Sessions</grouping>
    <selecttype>text</selecttype>
    <setting />
    <help>Domain that the cookie is valid for</help>
</setting>

который я загружаю в объект, используя:

$xml_object = simplexml_load_file('cookie_domain.xml');

Проблема в том, что я хочу, чтобы элемент 'setting' был нулевым, как указано в XML, но то, что я получаю от объекта, когда я превращаю его в массив, это:

Array
(
    [parameter] => cookie_domain
    [displayname] => Cookie Domain
    [grouping] => Sessions
    [selecttype] => text
    [setting] => SimpleXMLElement Object
        (
        )

    [help] => Domain that the cookie is valid for
)

Есть ли способ заставить SimpleXML учитывать «нулевое» значение вместо того, чтобы помещать туда «объект SimpleXMLElement»? Итак, я бы закончил с:

Array
(
    [parameter] => cookie_domain
    [displayname] => Cookie Domain
    [grouping] => Sessions
    [selecttype] => text
    [setting] => 
    [help] => Domain that the cookie is valid for
)

Я использую эту информацию для импорта в базу данных, и объект вызывает проблемы, так как мне нужно, чтобы элемент был там, даже если он «нулевой», поскольку это допустимо в моем приложении.

Спасибо большое,

Рассел


person Russell Seymour    schedule 18.08.2013    source источник
comment
Как (и почему) вы превращаете его в массив? SimpleXML не предназначен для синтаксического анализа XML в массив, он представляет API-интерфейс, подобный массиву (а также объектный), для анализируемого XML.   -  person IMSoP    schedule 19.08.2013


Ответы (1)


В XML самозакрывающийся элемент (например, <foo />) эквивалентен элементу с пустым содержимым (например, <foo></foo>), поэтому, если вы хотите, чтобы это переводилось как значение php NULL, вам придется проверить, является ли содержимое пустой строкой.

Простым способом получить то, что вы хотите, с учетом опубликованного вами примера, было бы перебрать каждый элемент в документе, установив ключ массива в соответствующую строку и заменив пустые строки на NULL:

$settings_array = array();
foreach ( $xml_object->children() as $tag_name => $element )
{
    $settings_array[$tag_name] = trim( (string)$element );
    if ( strlen($settings_array[$tag_name]) == 0 )
    {
        $settings_array[$tag_name] = NULL;
    }
}

Вот живая демонстрация.

person IMSoP    schedule 19.08.2013