2012-03-06 2 views
4

При попытке извлечь данные из файла XML с помощью Zend_Config_Xml, я ищу лучший способ обработки этих данных, когда несколько элементов имеют одинаковое имя. Пожалуйста, взгляните на следующий пример.Zend: Как управлять XML-данными, когда несколько элементов имеют одно и то же имя, используя Zend_Config_Xml?

Вот XML-файл:

<?xml version="1.0" encoding="UTF-8" ?> 
<root> 
    <stylesheets> 
     <stylesheet>example1.css</stylesheet> 
     <stylesheet>example2.css</stylesheet> 
    </stylesheets> 
</root> 

Вот код:

$data = new Zend_Config_Xml('./path/to/xml_file.xml', 'stylesheets'); 
$stylesheets = $data->stylesheet->toArray(); 

То, что я хотел бы сделать, это перебирать $stylesheet массива с помощью цикла Еогеасп, извлекая имя файла (ы), а затем добавьте таблицу стилей к headLink(). Это отлично работает ... однако, я столкнулся с проблемами, когда число <stylesheet> элементов меньше 2. Так, например, если мы удалим <stylesheet>example2.css</stylesheet> из файла XML, я столкнулся с Fatal error: Call to a member function toArray() on a non-object. Как бы вы справились с этой ситуацией?

UPDATE 1 - Альтернативное SimpleXML Решение:

Лично я решил эту проблему, используя SimpleXML как Zend причинял мне слишком много седых волос. Это будет работать, даже если нет элементов <stylesheet>. К сожалению, я не чувствую себя очень «гладким» и надеялся на решение Zend.

// define path to skin XML config file 
$path = './path/to/file'; 

if (file_exists($path)) { 
    // load the config file via SimpleXML 
    $xml = simplexml_load_file($path); 
    $stylesheets = (array)$xml->stylesheets; 

    // append each stylesheet 
    foreach ($stylesheets as $stylesheet) { 
     if (is_array($stylesheet)) { 
      foreach ($stylesheet as $key => $value) { 
       $this->setStylesheet('/path/to/css/' . $value); 
      } 
     } else { 
      $this->setStylesheet('/path/to/css/' . $stylesheet); 
     } 
    } 
} 

// function to append stylesheets 
private function setStylesheet($path) 
{ 
    $this->view->headLink()->appendStylesheet($path); 
} 

UPDATE 2 - Громоздкий Zend Решение:

На основе обратной связи, это решение работает с 0 до многих числа stylesheet элементов ... оно не очень красиво. Я надеялся на неплохо связанную конструкцию, что-то стандартизованное, на котором вы могли бы использовать взаимозаменяемые и одновременно простые в реализации.

// load the skin config file 
$path = './path/to/file.xml'; 
if (file_exists($path)) { 
    $data = new Zend_Config_Xml($path, 'stylesheets'); 
    $stylesheets = $data->toArray(); 

    // append each stylesheet 
    if (array_key_exists('stylesheet', $stylesheets)) { 
     foreach ((array)$stylesheets['stylesheet'] as $key => $value) { 
      $this->view->headLink()->appendStylesheet(
       '/path/to/css/' . $value); 
     } 
    } 
} 
+0

Там есть аналогичный вопрос здесь: http://stackoverflow.com/questions/5415651/zend-config-xml-strange -behaviour Принятый ответ может направить вас к некоторым возможным обходным решениям. – dinopmi

+0

Благодарим вас за сообщение. У меня есть свое обходное решение для этой конкретной проблемы, однако я не думаю, что это очень ... довольно. Я не ищу быстрого решения, я пытаюсь установить лучшие практики, рассматривая различные ответы, взвешивая каждый подход и добавляя сообщество, предоставляя надежное решение. – Hegemon

ответ

2

Получить массив и силу для массива, если только один элемент:

$data = new Zend_Config_Xml($c, 'stylesheets'); 
$data = $data->toArray(); 
var_dump((array) $data['stylesheet']); 
+0

Спасибо за отзывы, см. Выше. – Hegemon