begin process at 2012 02 09 10:11:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Xml

 > CONVERTISSEUR XML <=> TABLEAUX ASSOCIATIFS PHP

CONVERTISSEUR XML <=> TABLEAUX ASSOCIATIFS PHP


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

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

Auteur : fass2q

Ecrire un message privé
Site perso
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.


 Sources de la même categorie

OBTENIR LES TAUX DE CHANGE DU JOUR EN EUROS par oallais
Source avec Zip AFFICHER LES FILM EN SALLE par slhuilli
Source avec Zip Source avec une capture MINI-PROCESSEUR XPROC (PIPELINE XML) par ordiman85
Source avec Zip Source avec une capture XML MAPPING TO CLASS OBJECTS / CHARGEMENT / PARSING / MODIFI... par aKheNathOn
Source avec Zip Source avec une capture VIEWER POUR JALBUM SKIN CHAMELEON LIVRE D'OR par ym_trainz

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
EQUIVALENT DE INNERHTML JAVASCRIPT, MAIS GLOBAL par 8Tnerolf8
Source avec Zip XML ET TABLEAUX : UNE CLASSE COMPLÈTE QUI CONVERTIT UN DOCUM... par DaCodeManiak
Source avec Zip Source avec une capture AGENDA BASÉ SUR FLUX RSS PRÉSENTÉ EN TABLEAU OU EN AGENDA ! par cedriclomb
CONVERTIR RAPIDEMENT UNE TABLE MYSQL EN FICHIER XML SANS PRE... par mmconcept

Commentaires et avis

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.

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.

Commentaire de ltnweb le 29/09/2004 09:47:23

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

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

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)

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é ?

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

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)

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...

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)

Commentaire de antebios le 14/06/2005 13:35:10

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

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

convertir xml en tableau afin extraire les données [ par sexynounours69 ] Je dois récuperer les données d'un fichier xml: ------------------------------------------------------------------------ <table_structur XML to PHP [ par nuns ] Bonjour J'espère que j'ai posté dans le bon endroit, donc je vais expliquer la situation. <br / Afficher infos dans tableau selon actions dans une table [ par aforpien ] Bonsoir à tous, Je réalise un programme de logging d'activitées au sein de mon intranet. J'aimerai pouvoir savoir, sur un écran, qui fait quoi, et en convertir plusieurs variable en un tableau [ par 1030 ] Bonjour, me semble que c'est possible .... j'ai des variable [code=php]$nom = "mon nom"; $prenom = "asddfsd";[/code] et j'aimerais les faire passer 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 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( php et base de données [ par lsamsoumal ] bonjour j'ai un code qui récupére un tableau d'une base de données. dans ce tableau je veux avoir 3 liens vers des pages internet:mauritanie,infoclima 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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales