2013-08-18 3 views
1

Я следующий файл XML называется «cookie_domain.xml» с содержимым:PHP SimpleXML Загрузить файл с нулевыми элементами

<?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 соблюдал значение «null» вместо того, чтобы помещать объект SimpleXMLElement? Так что я бы в конечном итоге с:

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

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

Большого спасибо,

Рассел

+0

Как (и почему) вы превращаете его в массив? SimpleXML - это * не *, предназначенный для анализа XML в массиве, он представляет собой подобный массиву (а также объектно-подобный) API для проанализированного XML. – IMSoP

ответ

0

В 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; 
    } 
} 

Here is a live demo.