Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Array to XML


Автор: bubl1k 9.9.2010, 15:47
Код

    function xmltoarray($item) {
        foreach($item as $name => $child) {
                 $attr = (array)$child->attributes();

                 $array[$name]['@attributes'] = $attr['@attributes'];
                 $array[$name]['@content'][] = xmltoarray($child);
        }
        
        return isset($array) ? $array : (array)$item;
    }

    $xml = simplexml_load_file($filename);
 
    $array = xmltoarray($xml);


Вот таким образом я преобразую xml в массив, но уже пару часов мучаюсь и никак не выходит написать функцию которая конвертирует этот массив обратно в XML.

Прошу помощи г-да.

Готов выдать 300р на пиво тому кто напишет.

Автор: SneG0K 9.9.2010, 16:12
http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/
С тебя пиво smile 

Автор: bubl1k 9.9.2010, 16:19
Это какая-то ерунда.

Мне нужен конверт в xml массива в формате который выдает моя функция  smile 

Автор: Алексей 9.9.2010, 18:09
На 

Код

function www($array){
    foreach ($array as $name=>$child){
        if($name){
            $attr = '';
            if(is_array($child['@attributes'])){
                foreach($child['@attributes'] as $key=>$value){
                    $attr .= ' '.$key.'="'.$value.'"';
                }
            }

            $txt .= "<$name$attr>";
            $txt .= www($child['@content'][0]);
            $txt .= "</$name>";    
        }
        if(!is_array($child)) $txt .= $child;
    }
    return $txt;
}


Генерит XML строку типа '<a><b></b></a>'. Дальше делай с ней, что хочешь. 

P.S. в твоей функции ошибка. Она теряет внешней элемент.
Т.е. если XML вида
Код

<a>
    <b>
         <c>text</c>
         <c>stuff</c>
   </b>
   <d>
         <c>code</c>
   </d>
</a>
 

То в масиве пропадет элемент <a>. В сдедствие этого не получится создать экземпляр simpleXml из строки. $xml = new SimpleXMLElement($string);

С тебя 300 руб smile

Автор: bubl1k 10.9.2010, 05:10
Алексей, ваша функция не прошла обкатку.

Код

<control>
    <banner type="tab">
        <text type="input">Раз</text>
        <text type="input">Два</text>
    </banner>

    <banner type="tab">
        <text type="input">Раз</text>
        <text type="input">Два</text>
        <somebody type="group">
               <text type="input">Раз</text>
        </somebody>
    </banner>
        
</control>

Автор: Алексей 10.9.2010, 10:17
 smile А вы xml правильный дайте и все пройдет.
Скажем 
Код

var_dump(simplexml_load_file('test.xml'))

Выведет false;

Автор: bubl1k 10.9.2010, 15:28
Код

    function xmltoarray($item) {
        
        foreach($item as $name => $child) {
                 $attr = (array)$child->attributes();
                 $array[][$name] = array("@content" => xmltoarray($child), "@attributes" => isset($attr['@attributes']) ? $attr['@attributes'] : '');
        }
        
        return isset($array) ? $array : array((string)$item);
    }


    function arraytoxml($array, &$xml = FALSE) {

        if($xml === FALSE) {
            $xml = new SimpleXMLElement("<control></control>");
        }

        foreach ($array as $name => $item) {

                    if(isset($item["@attributes"])) {
                        $xml->addChild($name);
                        arraytoxml($item, $xml->$name);
                    }
                    else {
                        if(is_array($item)) arraytoxml($item, $xml);
                    }

        }

        return $xml;
    }

    $filename = 'xml/static.xml';
    
    $xml = simplexml_load_file($filename);
    $array = xmltoarray($xml);
    $xml = arraytoxml($array);
    
    print_r($array);
    print_r($xml);


В общем я остановился на таком коде, если кто успеет доработать раньше меня его найдет обещанная награда.

Автор: bubl1k 13.9.2010, 09:52
В общем получилось эту задачу решить самому вышло вот что - http://paste.ideaslabs.com/show/lReFz2kFM

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)