Окт 25

Сначала основная подзадача указанной задачи:
Нужно генерировать массивы указанной структуры

array('#name' => '', '#value' => '', '#attrs' => array(), '#type' => '')

Причём входные массивы могут быть различными:
«простой тег»

array('tag' => 'value')

«сложный тег»

array('#name' => 'tag', '#value' => 'value')

и массив тегов

array('tag' => array(array('nested_tag' => array('nested' => 'value1')), array('nested_tag' =>'value2')))

Причём они могут вкладываться друг в друга для генерации сложных XML-структур.
Без tdd, ясное дело, не обошлось.
В итоге имеем класс для генерации подобных массивов с тестами к нему.
Все файлы в приложении (код самого класса, тесты)

Ну и полный код с примером использования:
full_example

Теги:
Сен 25

Если на сервере стоит версия php >= 5.0 (а сложно представить другое;)), то удобнее всего пользоваться классом SimpleXML.
Здесь я опишу работу с ним.

Создание объекта

2 основных способа – через конструктор и через factory-функцию simplexml_load_string.
Второй способ лучше тем, что при ошибке создания объекта вернёт false.
Правда, при этом будет выдавать E_WARNING, что не очень приятно.
Но есть способ побороться с этим – использовать функцию http://www.php.net/manual/en/function.libxml-use-internal-errors.php, которая запрещает вывод ошибок при парсинге XML-данных и позволяет приложению управляться с ними самому.
Соответственно, создание объекта SimpleXML можно реализовать так:

<?php
    public static function parse2Obj($xmlString)
    {
        libxml_use_internal_errors(true);
        $xmlObj = @simplexml_load_string($xmlString);//на всякий случай;)
        if ($xmlObj === false)
            return false;
        return $xmlObj;
    }

Дальнейшая работа с данными

Далее нужно обработать полученные данные.
Здесь всё достаточно просто: каждый из XML-нодов представляет теперь объект класса SimpleXML.
Т.е. к любому узлу можно обратиться примерно так:

$xml->movie[0]->plot;

При этом если используются спецсимволы в «имени свойства», то можно сделать так:

$xml->movie->{'great-lines'}->line;

Для нескольких дочерних элементов можно использовать циклы

foreach ($xml->movie as $movie)
{
   echo $movie->plot, '<br />';
}

При этом, правда, есть нюансы – к примеру, неправильно отрабатывает count($xml->movie).
Для нормальной работы необходимо использовать метод children (странное название):

$t = $xml->movie->children();
foreach ($t as $movie)
{
   echo $movie->plot, '<br />;
}
Теги:
preload preload preload