Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERTISSEUR XML <=> TABLEAUX ASSOCIATIFS PHP


Information sur la source

Catégorie :Xml Classé sous : convertir, xml, tableau Niveau : Débutant Date de création : 29/08/2004 Vu : 10 837

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Cette librairie de quelque lignes permet de convertir un contenu XML en tableau associatif php et inversement.
Le plus gros du code concerne le sens XML => Assoc car il faut parser les balises XML.
Ceux qui souhaitent éviter d'utiliser xml_parse() pour une raison ou une autre y trouverons leur compte.
 

Source

  • <?
  • # lib.assoc.xml.php: Assoc <=> XML Conversion
  • #
  • # Date: August, 29 2004
  • # Author: YARD Mathieu / FAYA Solutions
  • # URL: http://www.faya.fr/
  • # Contact: lib.assoc.xml@faya.fr
  • #
  • define(AX_NAME_SUBKEY,'__name__');
  • define(AX_CONTENT_SUBKEY,'__content__');
  • define(AX_DEFNAME, 'unknown');
  • ###### PRIVATE FUNCTIONS ###############################################################
  • # Is next element an xml nod ? (or is it a leaf...)
  • function is_balise_next($buf,$os)
  • {
  • $l=strlen($buf);
  • $x = $buf[$os];
  • while((ord($x)<=32)&&($os<$l)) $os++;
  • return($x=='<');
  • }
  • # Parse strings like keyword="value"
  • function read_kv(&$os, $buf)
  • {
  • $sw = 0;
  • $lb = strlen($buf);
  • while($os<$lb)
  • {
  • $x = $buf[$os];
  • if(($x=='/')||($x==' ')||($x=='>')) break;
  • if($x == '=')
  • $sw = 1;
  • else
  • $val[$sw] .= $x;
  • $os++;
  • }
  • list($k,$v) = $val;
  • # Conditional quotes extraction
  • if(ereg("^[\'\"](.*)[\'\"]$",$v,$tbl)) $v = $tbl[1];
  • return(array($k=>$v));
  • }
  • ###### PUBLIC FUNCTIONS #############################################################
  • # Create a root XML Object
  • function ax_root($name = null, $content = null)
  • {
  • $assoc = array();
  • if($name) $assoc[AX_NAME_SUBKEY] = $name;
  • if($content) $assoc[AX_CONTENT_SUBKEY] = $content;
  • return($assoc);
  • }
  • # Create an XML Object
  • function &ax_balise(&$root, $name = null, $content = null)
  • {
  • $assoc = ax_root($name,$content);
  • return($root[] = $assoc);
  • }
  • # Generate XML code from an assoc array.
  • function assoc2xml(&$xmlbuf, $assoc)
  • {
  • if(!is_array($assoc)) return true; // Nothing to do
  • # Object name extraction
  • foreach($assoc as $ref => $content)
  • {
  • if(is_numeric($ref))
  • assoc2xml(&$sub,$content);
  • else
  • {
  • if($ref==AX_NAME_SUBKEY)
  • $name = $content;
  • elseif($ref==AX_CONTENT_SUBKEY)
  • $bc = $content;
  • else
  • {
  • $out .= ' '.$ref;
  • if($content) $out .= '="'.addslashes($content).'"';
  • }
  • }
  • }
  • # If there's some subnods :
  • if($sub)
  • $out .= '>'.$sub.'</'.$name.'>';
  • # If there's a content :
  • elseif($bc)
  • $out .= '>'.htmlentities($bc).'</'.$name.'>';
  • # Empty marker :
  • else $out .= '/>';
  • $xmlbuf .= '<'.$name.$out;
  • return(true);
  • }
  • # Parsing XML into an assoc array.
  • function xml2assoc(&$assoc,$xmlbuf,$more=array())
  • {
  • $lenbuf=strlen($xmlbuf);
  • $os=0;
  • while($os<$lenbuf)
  • {
  • $x = $xmlbuf[$os];
  • if(ord($x)>32)
  • {
  • # A marker should be found
  • if(!xa_xbalise_read($os, $assoc, $xmlbuf, $more)) return false;
  • }
  • else $os++;
  • }
  • return true;
  • }
  • # XML marker parsing
  • //function xa_xbalise_read(&$os, &$assoc, $xmlbuf, $more = array())
  • function xa_xbalise_read(&$os, &$assoc, $xmlbuf, $more = array("strict"=>true))
  • {
  • if(($x = $xmlbuf[$os++]) != '<') return false;
  • $xbufsz = strlen($xmlbuf);
  • # Read of marker name
  • while($os < $xbufsz)
  • {
  • $x = $xmlbuf[$os];
  • if(($x == ' ')||($x == '/')||($x == '>')) break;
  • $name .= $x;
  • $os++;
  • }
  • $assoc[AX_NAME_SUBKEY] = $name;
  • # Read of marker parameter (xxxxx="yyyyy")
  • while($os<$xbufsz)
  • {
  • $x = $xmlbuf[$os];
  • if($x=='/')
  • if($xmlbuf[$os+1]=='>') { $no_close=true; $os+=2; break; } # End of leaf marker
  • if($x=='>') { $os++; break; } # End of nod marker
  • # Read unique assignement
  • if(ord($x)>32)
  • {
  • list($key,$value) = each(read_kv(&$os, $xmlbuf));
  • if($key) $assoc[$key] = $value;
  • }
  • else $os++;
  • }
  • # Spaces jumping
  • while($os<$xbufsz)
  • {
  • $x=$xmlbuf[$os];
  • if(ord($x)>32) break;
  • $os++;
  • }
  • if($no_close) return true;
  • # Marker content extraction
  • $content = substr($xmlbuf,$os);
  • # Ending marker detection
  • $closing = '</'.$name.'>'; $lc = strlen($closing);
  • if(false === ($endpos = strpos($content,$closing)))
  • {
  • if($more['strict']) return false; # end of marker not found !
  • $endpos = strlen($content);
  • }
  • $content = substr($content,0,$endpos);
  • $startpos = $os;
  • # Content or submarker is coming next?
  • if(is_balise_next($content,0))
  • {
  • while(($os-$startpos) < $endpos)
  • {
  • $tmp=array();
  • if(!xa_xbalise_read(&$os,&$tmp,$xmlbuf,$more)) return false; # Erroneous submarker !
  • $assoc[] = $tmp;
  • }
  • }
  • else
  • {
  • $assoc[AX_CONTENT_SUBKEY] = $content;
  • $os += $endpos;
  • }
  • # If can't find ending marker
  • if(($xbufsz - $os - $lc)<0) return($more['strict']?false:true);
  • $os += $lc;
  • return true;
  • }
  • ###### TESTING ################################################################
  • # This part demonstrates how to use this library.
  • function printr ( $var, $do_not_echo = false )
  • {
  • ob_start();
  • print_r($var);
  • $code = htmlentities(ob_get_contents());
  • ob_clean();
  • if ( !$do_not_echo )
  • {
  • echo "<pre>$code</pre>";
  • }
  • return $code;
  • }
  • function xa_test()
  • {
  • # 1. CONSTRUCT A SIMPLE PHP XML ASSOC ARRAY
  • $root = ax_root('animals'); # XML root marker
  • $dogs = ax_balise($root, "dogs"); # XML child
  • $dogs['kinds'] = 2; # XML marker property
  • $dogs['size'] = "big";
  • $labrador = ax_balise($dogs, "labrador");
  • $labrador[retreiver] = '';
  • $chihuahua = ax_balise($dogs, "chihuahua", "charly");
  • $cats = ax_balise($root, "cats");
  • $persian = ax_balise($cats, "persian");
  • $siamese = ax_balise($cats, "siamese");
  • $root['kinds'] = 'dogs,cats';
  • $staff = ax_balise($dogs, "staff");
  • $staff[weight] = 40;
  • # 2. PHP XML ASSOC ARRAY => XML BUFFER
  • printr($root);
  • echo "<hr>";
  • assoc2xml($xmlbuf,$root);
  • echo("XML: ".htmlentities($xmlbuf)."<br/>");
  • # 3. XML BUFFER => PHP XML ASSOC ARRAY (check)
  • echo "<hr>";
  • xml2assoc($assoc,$xmlbuf);
  • echo("Check: ".(($assoc == $root)?'ok':'non')."<br/>");
  • printr($root);
  • }
<?

# lib.assoc.xml.php: Assoc <=> XML Conversion
#
# Date:     August, 29 2004
# Author:   YARD Mathieu / FAYA Solutions
# URL:      http://www.faya.fr/
# Contact:  lib.assoc.xml@faya.fr
#

define(AX_NAME_SUBKEY,'__name__');
define(AX_CONTENT_SUBKEY,'__content__');
define(AX_DEFNAME, 'unknown');

###### PRIVATE FUNCTIONS ###############################################################

# Is next element an xml nod ? (or is it a leaf...)
function is_balise_next($buf,$os)
{
  $l=strlen($buf);
  $x = $buf[$os];  
  while((ord($x)<=32)&&($os<$l)) $os++;
  return($x=='<');  
} 

# Parse strings like keyword="value"
function read_kv(&$os, $buf)
{
  $sw = 0; 
  $lb = strlen($buf);
  
  while($os<$lb)
  {
    $x = $buf[$os];
    if(($x=='/')||($x==' ')||($x=='>')) break;
    
    if($x == '=') 
      $sw = 1; 
    else 
      $val[$sw] .= $x;
    
    $os++;
  }
  
  list($k,$v) = $val;
  
  # Conditional quotes extraction
  if(ereg("^[\'\"](.*)[\'\"]$",$v,$tbl)) $v = $tbl[1];

  return(array($k=>$v));
}

###### PUBLIC FUNCTIONS #############################################################

# Create a root XML Object
function ax_root($name = null, $content = null)
{
  $assoc = array();
  if($name) $assoc[AX_NAME_SUBKEY] = $name;
  if($content) $assoc[AX_CONTENT_SUBKEY] = $content;   
  return($assoc);
}

# Create an XML Object
function &ax_balise(&$root, $name = null, $content = null)
{
  $assoc = ax_root($name,$content);
  return($root[] = $assoc);
}

# Generate XML code from an assoc array.
function assoc2xml(&$xmlbuf, $assoc)
{
  if(!is_array($assoc)) return true;  // Nothing to do
  
  # Object name extraction
  foreach($assoc as $ref => $content)
  {
    if(is_numeric($ref))
      assoc2xml(&$sub,$content);
    else
    {
      if($ref==AX_NAME_SUBKEY)
        $name = $content;
      elseif($ref==AX_CONTENT_SUBKEY)
        $bc = $content; 
      else
      {
        $out .= ' '.$ref;
        if($content) $out .= '="'.addslashes($content).'"';
      }
    } 
  }
  
  # If there's some subnods :  
  if($sub)
    $out .= '>'.$sub.'</'.$name.'>';    
  # If there's a content :
  elseif($bc)
    $out .= '>'.htmlentities($bc).'</'.$name.'>';
  # Empty marker :
  else $out .= '/>';
  
  $xmlbuf .= '<'.$name.$out;
  return(true); 
}

# Parsing XML into an assoc array.
function xml2assoc(&$assoc,$xmlbuf,$more=array())
{
  $lenbuf=strlen($xmlbuf); 
  $os=0;
  while($os<$lenbuf)
  {
    $x = $xmlbuf[$os];
    if(ord($x)>32)
    {
      # A marker should be found 
      if(!xa_xbalise_read($os, $assoc, $xmlbuf, $more)) return false;
    }    
    else $os++;     
  }    
  return true;
}

# XML marker parsing
//function xa_xbalise_read(&$os, &$assoc, $xmlbuf, $more = array())
function xa_xbalise_read(&$os, &$assoc, $xmlbuf, $more = array("strict"=>true))
{
  if(($x = $xmlbuf[$os++]) != '<') return false;
        
  $xbufsz = strlen($xmlbuf);

  # Read of marker name  
  while($os < $xbufsz)
  {
    $x = $xmlbuf[$os];
    if(($x == ' ')||($x == '/')||($x == '>')) break;
    $name .= $x;
    $os++;
  }
  
  $assoc[AX_NAME_SUBKEY] = $name;

  # Read of marker parameter (xxxxx="yyyyy")
  while($os<$xbufsz)
  {
    $x = $xmlbuf[$os];
    
    if($x=='/') 
      if($xmlbuf[$os+1]=='>') { $no_close=true; $os+=2; break; } # End of leaf marker
    if($x=='>') { $os++; break; }   # End of nod marker

    # Read unique assignement
    if(ord($x)>32) 
    {
      list($key,$value) = each(read_kv(&$os, $xmlbuf));
      if($key) $assoc[$key] = $value;
    }          
    else $os++;
  }
  

  # Spaces jumping
  while($os<$xbufsz) 
  {
    $x=$xmlbuf[$os];
    if(ord($x)>32) break; 
    $os++;
  }
  
  if($no_close) return true;
  
  # Marker content extraction
  $content = substr($xmlbuf,$os);

  # Ending marker detection
  $closing = '</'.$name.'>'; $lc = strlen($closing);

  if(false === ($endpos = strpos($content,$closing)))
  {
    if($more['strict']) return false;  # end of marker not found !
    $endpos =  strlen($content);
  }
  $content = substr($content,0,$endpos);
  $startpos = $os;

  # Content or submarker is coming next?
  if(is_balise_next($content,0))
  {
    while(($os-$startpos) < $endpos)
    {
      $tmp=array();
      if(!xa_xbalise_read(&$os,&$tmp,$xmlbuf,$more)) return false; # Erroneous submarker !
      $assoc[] = $tmp;
    }
  }
  else
  {
    $assoc[AX_CONTENT_SUBKEY] = $content;
    $os += $endpos;
  }

  # If can't find ending marker
  if(($xbufsz - $os - $lc)<0) return($more['strict']?false:true);
  
  $os += $lc;
 
  return true;
}


###### TESTING ################################################################

# This part demonstrates how to use this library.

function printr ( $var, $do_not_echo = false )
{
   ob_start();
   print_r($var);
   $code =  htmlentities(ob_get_contents());
   ob_clean();
   if ( !$do_not_echo )
   {
       echo "<pre>$code</pre>";
   }
   return $code;
}

function xa_test()
{
  # 1. CONSTRUCT A SIMPLE PHP XML ASSOC ARRAY
  $root = ax_root('animals');         # XML root marker

  $dogs = ax_balise($root, "dogs"); # XML child
  $dogs['kinds'] = 2;                 # XML marker property
  $dogs['size'] = "big";

  $labrador = ax_balise($dogs, "labrador");
  $labrador[retreiver] = ''; 

  $chihuahua = ax_balise($dogs, "chihuahua", "charly");

  $cats = ax_balise($root, "cats");

  $persian = ax_balise($cats, "persian");
  $siamese = ax_balise($cats, "siamese");

  $root['kinds'] = 'dogs,cats';

  $staff = ax_balise($dogs, "staff");
  $staff[weight] = 40;
  
  # 2. PHP XML ASSOC ARRAY => XML BUFFER

  printr($root);
  echo "<hr>";
  
  assoc2xml($xmlbuf,$root);
  
  echo("XML: ".htmlentities($xmlbuf)."<br/>");

  # 3. XML BUFFER => PHP XML ASSOC ARRAY (check)

  echo "<hr>";
  
  xml2assoc($assoc,$xmlbuf);

  echo("Check: ".(($assoc == $root)?'ok':'non')."<br/>");  

  printr($root);

}

Conclusion

Tout le fichier est commenté en anglais et divisé en 3 parties: fonctions privées, fonctions publiques et routine de test.
La section routine de test est prévue pour vous faire une démonstration de l'utilisation de la librairie.

 

Commentaires et avis

signaler à un administrateur
Commentaire de GRenard le 30/08/2004 13:17:16

Ca n'existe pas des fonctions publics; privées comme ca... Si tu veux le faire, tu dois faire une classe.

signaler à un administrateur
Commentaire de fass2q le 03/09/2004 13:46:30

Oui, je sais bien... c'est juste pour indiquer à l'utilisateur final du code quels fonctions lui sont déstinées et quelles fonctions servent à la librairie proprement dite.

signaler à un administrateur
Commentaire de ltnweb le 29/09/2004 09:47:23

C'est beau tout ça mais ça s'utilise comment ????!

signaler à un administrateur
Commentaire de GRenard le 29/09/2004 15:28:21

C'est vrai que c'est pas énormément documenté ... si jveux passer un code xml c'est ou que j'envoie ca... de plus, si jamais dans mon code il y a <balise attrib="something>">bla</balise> ca va planter je crois...
De plus tu utilises du allow_call_time_pass_reference à On, et c'est rendu désuet... si ta fonction possède le & tu n'as pas besoin de lui passer directement le & lorsque tu appelles la fonction...
Tu devrais peut-etre lire ca http://www.phpcs.com/code.aspx?ID=24870
et pour une autre sour de xml (par contre, elle ne fait que convertir de xml->tableau)
http://www.phpcs.com/code.aspx?ID=24639

signaler à un administrateur
Commentaire de fass2q le 03/12/2004 12:09:02

Créez un php du style

<?

require_once("lefichierkésurcettepage.php");

xa_test();

?>


et alors tout deviendra clair ;o)

signaler à un administrateur
Commentaire de fass2q le 03/12/2004 12:16:22

GRenard, il y a effectivement peut etre quelque & inutiles, mais cela est purement syntaxique et n'influe pas sur les performances du codes; L'essentiel etant de passer des references ou des valeurs ou bons endroits.... quand au <balise attrib="something>">bla</balise> ben ca passe sans aucun problème... as-tu seulement essayé ?

signaler à un administrateur
Commentaire de DieuLePer le 09/12/2004 23:49:50

Bonjour,

Ce script fonctionne sous PHP 5.0.2 ?

Merci d'avance pour vos réponces :op

signaler à un administrateur
Commentaire de GRenard le 10/12/2004 00:42:02

Tout ce qui fonctionne sous php4 devrait fonctionner sous php5 (avec les mêmes configurations)

signaler à un administrateur
Commentaire de antebios le 14/06/2005 02:16:44

Quand je fais un copier collé je me retrouve avec un # devant chaque ligne...intestable a moins de s'amuser à effacer les # 1 par 1...

signaler à un administrateur
Commentaire de GRenard le 14/06/2005 04:11:00

c'est firefox qui fait ca... prend Internet Explorer ou autre... ou télécharge le zip quand il y en a un (ici yen a pas... sorry :P)

signaler à un administrateur
Commentaire de antebios le 14/06/2005 13:35:10

Ha oui en effet.
Merci.
Bizarre qu'il fasse ça.

signaler à un administrateur
Commentaire de mabeur le 17/11/2005 18:09:50

Hmm comment fait on pour spécifier un fichier xml a convertir en array ?

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

De doc vers XML, un algo? [ par EricLeRouge ] Bonjour, afin d'exploiter des donn&#233;es d'un documment word, j'aimerai le convertir en XML via php. Existe t il un algo?Je ne connais pas le XML, m convertir un tableau PHP en tableau JAVASCRIP [ par Spaceduck ] bonjour ben voila...la question est dans le sujet...comment faire pour pouvoir utiliser un tableau créé en php dans du javascript ?le tableau est en 3 transformation d'un fichier xml sous forme d'un tableau [ par ammar_emi ] bonjoir ,je suis débutant en xml ,je vx juste transformer un fichier xml sous formed un tableau html ou sous forme graphique.Par exemple mon fichier x Convertir TimeStamp en date dans un tableau excel [ par dreaman ] Convertir TimeStamp en date dans un tableau excel basic Parcourir un tableau multidimensionnel et creer le XML correspondant [ par Noizet ] Hello,J'ai un tableau multidimensionnel sous cette forme :object(stdClass)#2 (16) {  ["id"]=&gt;  string(5) "text2"  array(3) {    [0]=&gt;    object( XML to PHP [ par nuns ] Bonjour J'espère que j'ai posté dans le bon endroit, donc je vais expliquer la situation. <br / Transformation en XML d'un tableau complexe PHP [ par liba ] J'aimerai pouvoir transformer en XML un tableau complexe PHP différent à chaque fois au point de vue de son architecture (composé des divers éléments, xml dans un tableau php! SVG à la clé :) [ par jed35 ] Bonjour je débute en php et évidemment j'ai un probleme. Je cherche à placer des données (qui se trouvent dans un fichier xml) dans un tableau php.voi BBD ajouter un IP à un ID quand on se connect. [ par dan4 ] Je veux ajouter ou faire un update de IP quand quelqu'un se connect. et la date aussi.Ma base: wcamxLa table: authlib_logintableau 1 : idtableau 2 flash+mysql+php+xml=2 galleries d'images et je bloque [ par sniperbe ] salut a tous,comment faire pour obtenir ceci svp ???&lt;?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?&gt;&lt;paquay&gt;&lt;travail photo=


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,39 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.