Задача проста: конвертировать php массив любой вложенности в xml документ. Готового решения в самом языке так и не обнаружил. Есть функции которые конвертируют из массива в JSON и обратно, а вот в XML нет. Я конечно заядлый велосипедостроитель, но был не тот случай - время поджимало а проект надо было завершать. Ну что же немного поискав на просторах сети нашел нужное решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | class ArrayToXML { /** * Функция конвертации массива в XML объект * На вход подается мульти вложенный массив, на выходе получается с помощью рекурсии валидный xml * * @param array $data * @param string $rootNodeName - корень вашего xml. * @param SimpleXMLElement $xml - используется рекурсивно * @return string XML */ public static function toXml( $data , $rootNodeName = 'data' , $xml =null) { // включить режим совместимости, не совсем понял зачем это но лучше делать if ( ini_get ( 'zend.ze1_compatibility_mode' ) == 1) { ini_set ( 'zend.ze1_compatibility_mode' , 0); } if ( $xml == null) { $xml = simplexml_load_string( "<?xml version=\"1.0\" encoding=\"utf-8\"?><$rootNodeName />" ); } //цикл перебора массива foreach ( $data as $key => $value ) { // нельзя применять числовое название полей в XML if ( is_numeric ( $key )) { // поэтому делаем их строковыми $key = "unknownNode_" . (string) $key ; } // удаляем не латинские символы $key = preg_replace( '/[^a-z0-9]/i' , '' , $key ); // если значение массива также является массивом то вызываем себя рекурсивно if ( is_array ( $value )) { $node = $xml ->addChild( $key ); // рекурсивный вызов ArrayToXML::toXml( $value , $rootNodeName , $node ); } else { // добавляем один узел $value = htmlentities( $value ); $xml ->addChild( $key , $value ); } } // возвратим обратно в виде строки или просто XML-объект return $xml ->asXML(); } } |
Использовать это чудо можно так
1 2 | $data = array ( 'color' => 'red' , 'colors' => array ( '#fff' , '#ddd' , '#eee' )); echo ArrayToXML::toXML( $data ); |
В итоге на выходе получаем
1 2 3 4 5 6 7 8 9 | <? xml version = "1.0" encoding = "utf-8" ?> < data > < color >red</ color > < colors > < unknownNode >#fff</ unknownNode > < unknownNode >#ddd</ unknownNode > < unknownNode >#eee</ unknownNode > </ colors > </ data > |
Вот по настоящему полезный скрипт
Комментарии
а вот набор элементов уже не создать
Переименовал класс в Xml метод обозвал arrayToXml
На мой взгляд так логичней
$xml = simplexml_load_string("");