Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/07/2012, 13h50   #1
sekaijin
Expert Confirmé Sénior
 
Avatar de sekaijin
 
Homme
Urbaniste
Inscription : juillet 2004
Messages : 2 117
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 49
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 2 117
Points : 5 038
Points : 5 038
Par défaut Array to XML

Bonjour.

suite à de nombreuses interventions dans les forums AJAX traitant de pb de XML en javascript, alors qu'en fait il s'agit de génération de XML en utilisant des concaténations de chaine en php, J'ai excrit un petit exemple php pour générer un XML à partir d'un tableau php

les choix retenus sont
si le tableau contient une seule entrée sans clef ($a[0]) la racine (root) est 'xml'
si le tableau contient plusieurs entrées la racine est 'xml'

pour les tableau à index numérique un tag 'item' est créé.

Code php :
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
57
58
59
60
61
62
63
64
65
66
67
68
69
<pre><?php
 //tableau exemple
 $data = array(
    'test' => 'a',
    'integer' => 12,
    'null' => NULL,
    'array' => array(1, 2, 3, 4),
    'obj' => (object) array('a' => 56, 'b' => true, 'f' => 1.5)
 );
 
 //optention de la liste des clefs
 $keys =array_keys($data);
 
 //ajout du tag root si nécessaire
 if (count($data) != 1 || $keys[0] == 0) {  
  $data = array ('xml' => $data);
 }
 
 //juste pour voir ce qu'on va convertir
 print_r($data);
 
 //fonction de convertion
 // ajoute $data à $node dans le document $doc
 function addDatasInNodeOfDoc($data, $node, $doc) {
  foreach($data as $key => $value) {
   //si on a des index numériques 
   if ('integer' == gettype($key)) {
    $key = 'item';
   }
 
   //element null
   if ('NULL' == gettype($value)) {
    $elem = $doc->createElement($key, $value);
   //boolean 
   } elseif ('boolean' == gettype($value)) {
    $elem = $doc->createElement($key, $value);
   //double ou float 
   } elseif ('double' == gettype($value)) {
    $elem = $doc->createElement($key, $value);
   //integer
   } elseif ('integer' == gettype($value)) {
    $elem = $doc->createElement($key, $value);
   //string 
   } elseif ('string' == gettype($value)) {
    $elem = $doc->createElement($key, $value);
   //si on a un objet on traite ses membres 
   } elseif ('object' == gettype($value)) {
    $elem = $doc->createElement($key);
    addDatasInNodeOfDoc(get_object_vars($value), $elem, $doc);
   //si c'est un tableau
   } elseif ('array' == gettype($value)) {{
    $elem = $doc->createElement($key);
    addDatasInNodeOfDoc($value, $elem, $doc);
   }
   //on accroche le nouvel element au neud
   $node->appendChild($elem);
  }
  return $node;
 }
 
 //on crée le document
 $doc = new DOMDocument('1.0');
 //on ajoute toutes les donnée au document
 addDatasInNodeOfDoc($data, $doc, $doc);
 
 //affichage du xml
 echo htmlentities($doc->saveXML());
 
?></pre>

resultat :
Code 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
Array
(
    [xml] => Array
        (
            [test] => a
            [integer] => 12
            [null] => 
            [array] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4
                )
 
            [obj] => stdClass Object
                (
                    [a] => 56
                    [b] => 1
                    [f] => 1.5
                )
 
        )
 
)
<?xml version="1.0"?>
<xml>
  <test>a</test>
  <integer>12</integer>
  <null></null>
  <array>
    <item>1</item>
    <item>2</item>
    <item>3</item>
    <item>4</item>
  </array>
  <obj>
    <a>56</a>
    <b>1</b>
    <f>1.5</f>
  </obj>
</xml>

Attention pas de pretty print

A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2012, 14h20   #2
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
marche pas avec des clés vides ou numériques,
pour le pretty print juste faire
Code :
$doc->formatOutput = true;
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2012, 18h48   #3
sekaijin
Expert Confirmé Sénior
 
Avatar de sekaijin
 
Homme
Urbaniste
Inscription : juillet 2004
Messages : 2 117
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 49
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 2 117
Points : 5 038
Points : 5 038
je n'ai fais ça que pour le principe

mais
Code :
1
2
3
4
   //si on a des index numériques 
   if ('integer' == gettype($key)) {
    $key = 'item';
   }
je n'a effectivement pas testé le cas ou la clef est ''

c'est grandement prefectionnable

A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h12.


 
 
 
 
Partenaires

Hébergement Web