309 votes

Comment convertir un tableau en SimpleXML

Comment convertir un tableau en objet SimpleXML en PHP ?

6 votes

Un tableau de quoi ?

1 votes

0voto

Kamil Dąbrowski Points 135
function array2xml($array, $xml = false){

    if($xml === false){

        $xml = new SimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><'.key($array).'/>');
        $array = $array[key($array)];

    }
    foreach($array as $key => $value){
        if(is_array($value)){
            $this->array2xml($value, $xml->addChild($key));
        }else{
            $xml->addChild($key, $value);
        }
    }
    return $xml->asXML();
}

0voto

refeyd Points 1

Ma réponse, en rassemblant les réponses des autres. Cela devrait corriger l'échec de la compensation des touches numériques :

function array_to_xml($array, $root, $element) {
    $xml = new SimpleXMLElement("<{$root}/>");
    foreach ($array as $value) {
        $elem = $xml->addChild($element);
        xml_recurse_child($elem, $value);
    }
    return $xml;
}

function xml_recurse_child(&$node, $child) {
    foreach ($child as $key=>$value) {
        if(is_array($value)) {
            foreach ($value as $k => $v) {
                if(is_numeric($k)){
                    xml_recurse_child($node, array($key => $v));
                }
                else {
                    $subnode = $node->addChild($key);
                    xml_recurse_child($subnode, $value);
                }
            }
        }
        else {
            $node->addChild($key, $value);
        }
    }   
}

Le site array_to_xml() suppose que le tableau est d'abord constitué de touches numériques. Si votre tableau avait un élément initial, vous laisseriez tomber la fonction foreach() et $elem les déclarations du array_to_xml() et passer simplement la fonction $xml à la place.

0voto

x3m-bymer Points 37

Exemple de conversion de données xml en tableau php

function xml_to_array ($xml_data) {
          $p = xml_parser_create();
          xml_parse_into_struct($p,$xml_data,$vals,$index);
          xml_parser_free($p);
          return $vals;
 }

Voir ceci lien pour plus d'informations.

0voto

J'aurais commenté la deuxième réponse la plus votée, car elle ne préserve pas la structure et génère un mauvais xml s'il y a des tableaux internes indexés numériquement.

J'ai développé ma propre version basée sur celle-ci, car j'avais besoin d'un convertisseur simple entre json et xml, quelle que soit la structure des données. Ma version préserve les informations des clés numériques et la structure du tableau original. Elle crée des éléments pour les valeurs indexées numériquement en enveloppant les valeurs dans des éléments nommés valeur avec l'attribut key qui contient la clé numérique.

Par exemple

array('test' => array(0 => 'some value', 1 => 'other'))

se convertit en

<test><value key="0">some value</value><value key="1">other</value></test>

Ma version de la fonction array_to_xml (j'espère que cela aidera quelqu'un :)

function array_to_xml($arr, &$xml) {
    foreach($arr as $key => $value) {
        if(is_array($value)) {
            if(!is_numeric($key)){
                $subnode = $xml->addChild("$key");
            } else {
                $subnode = $xml->addChild("value");
                $subnode->addAttribute('key', $key);                    
            }
            array_to_xml($value, $subnode);
        }
        else {
            if (is_numeric($key)) {
                $xml->addChild("value", $value)->addAttribute('key', $key);
            } else {
                $xml->addChild("$key",$value);
            }
        }
    }
}

0voto

ace Points 1

Toute la structure XML est définie dans le tableau $data :

function array2Xml($data, $xml = null)
{
    if (is_null($xml)) {
        $xml = simplexml_load_string('<' . key($data) . '/>');
        $data = current($data);
        $return = true;
    }
    if (is_array($data)) {
        foreach ($data as $name => $value) {
            array2Xml($value, is_numeric($name) ? $xml : $xml->addChild($name));
        }
    } else {
        $xml->{0} = $data;
    }
    if (!empty($return)) {
        return $xml->asXML();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X