XML -> PHP : Ouai mais ....

XML -> PHP : Ouai mais .... - PHP - Programmation

Marsh Posté le 10-10-2005 à 12:49:21    

Bonjour à tous,
 
dans le cadre d'une refonte de site web, je planche actuellement sur l'exploitation des fichiers XML issue de la BDD produit, pour générer des pages et des menus dynamiques. Le but serait de prendre en compte les modifs, juste en faisant une MAJ des fichiers XML (soit un export de la BDD).
NB : Je ne peut à priori pas attaquer la BDD Oracle.......  sinon je l'aurai fait.....
 
J'ai fait le tour des parser XML qui existe en PHP (5.1.0), j'ai testé, mais c'est pas très concluant ! Je réccupère les données sous forme d'un MEGA tableau. Alors faut-il que je me paluche la mise en page du tableau, pour reccuperer les données ??  :(  
 
Ou aurriez vous une ID + simple, et donc + rapide ?
Merci.  :hello:


Message édité par djfx le 10-10-2005 à 12:50:32

---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 10-10-2005 à 12:49:21   

Reply

Marsh Posté le 10-10-2005 à 12:56:48    

Tu peux utiliser Xpath pour récupérer les données que tu veux

Reply

Marsh Posté le 10-10-2005 à 13:11:21    

Avec simpleXML, les données sont récupéré sous forme d'objets. Je sais pas ce que ca vaut pour des fichiers XML de plusieurs disaines de méga, mais c'est facile à utiliser avec des fichiers xml d'assez petite taille.
Mais de toute maniére, a partir du moment où t'as plusieurs fois la même catégorie de balise dans ton fichier xml, tu seras obligé de boucler dessus. Mais en sql aussi t'es obligé de boucler sur le résultat de la requette. ;)
 
 
Par contre, un truc que je ne comprend vraiment pas : c'est quoi ton histoire de faire un traitement sur la "mise en page du tableau" pour récupérer les données?

Reply

Marsh Posté le 10-10-2005 à 13:35:41    

Bah en fait quand je reccupere les données, c'est un tableau contenu dans un tableau, d'un tableau ....... c'est un truc a ralonge quoi ! En gros, à chaque balise il crée un nouveau tableau. Donc pour afficher j'ai bouclé dessus, mais genre pour lui dire de trier, et de reccuperer les données qui sont uniquement entre les balise XY, je lutte un peu..... :??:  
 
PS : Taille maxi des fichiers : 3Mo
Yen a une dizaine...


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 10-10-2005 à 13:38:35    

Tu fais comment pour récupérer les données pour le moment?

Reply

Marsh Posté le 10-10-2005 à 13:49:20    

Avec la methode sax tu peux recupérer les données d'un fichier xml comme tu veux. C toi qui défini le format du tableau que tu auras à la sortie.

Reply

Marsh Posté le 10-10-2005 à 14:12:11    

Sax ??? Interessant ......
Pour le moment j'ai reccupéré 1 script sur le site php.net, mais c'est bof bof ......
Ca ressemble à ca :
 
class xml2Array {
    var $arrOutput = array();
    var $resParser;
    var $strXmlData;
 
    function parse($strInputXML) {
 
        $this->resParser = xml_parser_create ();
        xml_set_object($this->resParser,$this);
        xml_set_element_handler($this->resParser, "tagOpen", "tagClosed" );
 
        xml_set_character_data_handler($this->resParser, "tagData" );
 
        $this->strXmlData = xml_parse($this->resParser,$strInputXML );
        if(!$this->strXmlData) {
            die(sprintf("XML error: %s at line %d",
            xml_error_string(xml_get_error_code($this->resParser)),
            xml_get_current_line_number($this->resParser)));
        }
         
        xml_parser_free($this->resParser);
        return $this->arrOutput;
    }
     
    function tagOpen($parser, $name, $attrs) {
        $tag=array("name"=>$name,"attrs"=>$attrs);
        array_push($this->arrOutput,$tag);
    }
     
    function tagData($parser, $tagData) {
        if(trim($tagData)) {
            if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData'])) {
                $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData;
            }else {
                $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
            }
        }
    }
 
    function tagClosed($parser, $name) {
        $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
        array_pop($this->arrOutput);
    }
}


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 10-10-2005 à 14:24:30    

Ha ben oui, tu m'étones que tu te retrouves avec un array contenant de multiples niveaux d'array.
En plus, avec une classe pareille tu risques de dépasser la taille mémoire maximale aloué au script php.
 
 
Essaye plustôt de traiter le fichier xml avec des fonctions faites pour ça : DOM, simpleXML ou SAX. (je me suis jamais penché sur SAX mais c'est quand même conus)

Reply

Marsh Posté le 10-10-2005 à 15:00:17    

Tiens regarde plutot la solution que je propose sur ce post ::
http://forum.hardware.fr/forum2.ph [...] y=0&nojs=0
 
Pas de souci de performance.

Reply

Marsh Posté le 10-10-2005 à 17:05:34    

Merci les gas  ;)  
Je vais regarder ca en detail des demain (J'ai pas trop de tps la). Je vous tiens au jus.


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 10-10-2005 à 17:05:34   

Reply

Marsh Posté le 10-10-2005 à 17:20:35    

T'es en PHP4, ou PHP5 ?

Reply

Marsh Posté le 10-10-2005 à 18:11:04    

FlorentG a écrit :

T'es en PHP4, ou PHP5 ?


 
5.1.0, c'est marqué au dessus  :hello:


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 10-10-2005 à 18:25:36    

Ah pardon :D

Reply

Marsh Posté le 12-10-2005 à 09:58:12    

Salut,  
bon j'ai pas trop de temps, mais je vien de regarder la solut de Dens91, mais j'ai l'impression que c'est pas gagné.
 
En effet, si ca semble marcher avec des balise comme ca : <cms>.....</cms>
Ca a l'air + chaud avec ca : <cms schema_version="1.3.0"> .....</cms>
 
En fait ya plein d'info dans les balises, et il faudrait que je les reccuperes ......  :(  
Sax ou DOM, ca fait ca ?  :??:  :heink:


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 12-10-2005 à 10:48:14    

Je vais peut-être me répéter mais Xpath (bis)
Un tuto pour comprendre de quoi il s'agit: http://jerome.developpez.com/xmlxsl/xpath/

Reply

Marsh Posté le 12-10-2005 à 10:55:23    

djfx a écrit :

Salut,  
En effet, si ca semble marcher avec des balise comme ca : <cms>.....</cms>
Ca a l'air + chaud avec ca : <cms schema_version="1.3.0"> .....</cms>
Sax ou DOM, ca fait ca ?  :??:


 
Bon ben apparament tu n'a fais aucune recherche sur le xml. Bref...
 
Non y'a aucun probleme schema_version="1.3.0" est un attribut de la balise <cms>. Tu peux utilisé la methode que tu veux DOM( methode hierachique) SAX ( methode evenementiel).
 
 
il suffit de faire un petite modif sur la fonction  de debut de balise que j'ai proposé CAD  
function startElement($parser, $name, $attrs) {
 global $buffer;  
 global $cpt_bien;  
  global $tab_resultats;        
 
 switch($name) {
   case "BIENS" : $cpt_bien = 0; break;
   case "CODE_CLIENT" :  
     case "TYPE_OFFRE" : $buffer = ''; break;
 }        
}  
 
Si tu la lit correctement tu constateras qu'il y a une variable $attrs qui n'es utilisé nullpart,  tu as des attribut donc tu peux l'utilisé pour les recupérés.  
 
Tu devras rajouté dans le code un truc du style
if(!empty($attrs))
$variable['attrs'] = $attrs;
 
Bon courage
 
Peux tu m'explique un brièvement a quoi sa te faire de parsr ce xml. Que vas tu faire des données récupéré ?
 
 
 

Reply

Marsh Posté le 12-10-2005 à 11:23:09    

vu que t'as de gros fichiers je te conseille plutot sax

Reply

Marsh Posté le 12-10-2005 à 11:36:26    

Oups, excuse Dens91, effectivement j'ai essayé ton bout de code, et ca marche avec des attributs ....  :D  Ok merci.
 
Objectif --> Site web +/- dynamique
En fait les XML proviennent de la BDD catalogue (que je peut pas attaquer direct pour le site en PHP, a moins d'heberger le site ici .....).
Donc je voudrai reccuperer les data pour faire des menus, et afficher les détails produits. je sais que ca risque d'etre long, mais quand il y aura des MAJ dans la base, j'aurai juste à exporter les XML.
 
Bref, je sais que c'est du bricolage, mais c'est une solution temporaire (6 mois maxi)........  :heink:


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 12-10-2005 à 11:41:58    

et tes fichiers xml ont quelle tete ?

Reply

Marsh Posté le 12-10-2005 à 12:04:54    

djfx a écrit :


Objectif --> Site web +/- dynamique
Donc je voudrai reccuperer les data pour faire des menus, et afficher les détails produits.


 
Si j'ai tous compris c pour faire des rendus HTML ?
Si c le cas tu peux oublié les parseurs XML et t'orienté vers l'XSLT et le feuilles de style. cela t'economiseras enormement de code PHP et reduira les temps de traitement, vue qu'il te faut juste une ligne de commande pour avoir une sortie html. Maintenant il faut des compétences XSL, faire des feuilles de style peux s'avérer des fois complexes. :-)
 

Citation :

ref, je sais que c'est du bricolage, mais c'est une solution temporaire (6 mois maxi)........


 
il n'existe pas de solution parfaite en informatique... on est souvent obligé d'adapté des solutions selon un budjet, un temps imparti, et des ressource dont on dispose. donc si ta solution fonctionne c le plus important!  :)

Reply

Marsh Posté le 12-10-2005 à 12:12:26    

Ok merci pour les infos, j'avoue que je ne savais pas trop par quel bout commencer.
 
J'avais deja mis le nez sur du XSLT, ca avait l'air pratique. Bon faut que je bloc qq jours pour faire ca.
 
cooltwan : --> Ca resemble a ca :  
 
<?xml version="1.0" encoding="Iso8859-1" ?>  
<cms schema_version="1.3.0">
  <publication cms_id="80" name="Web : F-Protection">
    <section cms_id="294" name="Onduleurs">
      <subsection cms_id="1315" name="Onduleurs">
        <item_group cms_id="6527" name="Pulsar Evolution rackable">
          <attribute cms_id="7" data_type="4">
            <data cms_id="33853" name="Argumentaire" short_name="Argumentaire" language_id="0">
               La gamme Pulsar Evolution est bla bla....  
            </data>  
          </attribute>
          <item item_code="MG3 66225" mftr_code="">
                blabla ...
          </item>
        </item_group>
/......  


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 12-10-2005 à 12:20:52    

djfx a écrit :

Ok merci pour les infos, j'avoue que je ne savais pas trop par quel bout commencer.
 
J'avais deja mis le nez sur du XSLT, ca avait l'air pratique. Bon faut que je bloc qq jours pour faire ca.


C'est pas pratique, c magique !! lol :)

Reply

Marsh Posté le 12-10-2005 à 14:16:17    

ARrrrrrrrggggggg  :fou:  
 
Zarraf ! XSLT est pu dispo sous PHP5, et simpleXML qui le remplace me fait n'importe quoi !  :sweat:
 
--------
 
Yessssssss, XSL Fonctionne ! C'est parti !  :bounce:

Message cité 1 fois
Message édité par djfx le 12-10-2005 à 14:41:17

---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 12-10-2005 à 14:44:03    

djfx a écrit :

ARrrrrrrrggggggg  :fou:  
 
Zarraf ! XSLT est pu dispo sous PHP5, et simpleXML qui le remplace me fait n'importe quoi !  :sweat:


 
Ah je savais pas que XSLT étais dispo sous php, la tu m'apprends quelque chose.
Perso j'ai toujours appelé XSLTPROC par un appel externe system.
exec(XSLTPROC ...les options);
 

Reply

Marsh Posté le 12-10-2005 à 14:54:55    

je viens d'alle faire un tour sur php.net, J'ai pas trop compris l'interret d'avoir integré sa à PHP. Sa marche parfaitement en ligne de commande je vois pas pourquoi ce prendre la tète a écrire 3 tonnes de code.

Reply

Marsh Posté le 12-10-2005 à 15:35:57    

Bon bref, comme je suis pas expert XSLT/XML, je me prononcerai pas la dessus ......  :jap:  
 
Donc visiblement XSLT c'etait dispo sous PHP4, et sou PHP5 ca devient XSL.
Par contre j'ai l'impression que ca utilise du DOM, vu ce qui est ecrit !  :heink:  
 
Voici le fichier PHP :  
------------------------------------------------------------------------------------
$xsl = new XSLTProcessor();
$xsl->importStyleSheet(DOMDocument::load($xsl_filename));
echo $xsl->transformToXML(DOMDocument::load($xml_filename));
------------------------------------------------------------------------------------
 
Et apres c'est du traitement <xsl:template ....... />
je commence à y voir clair ! Merci à tous.  :hello:


---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le 12-10-2005 à 16:06:36    

DEns91 a écrit :

je viens d'alle faire un tour sur php.net, J'ai pas trop compris l'interret d'avoir integré sa à PHP. Sa marche parfaitement en ligne de commande je vois pas pourquoi ce prendre la tète a écrire 3 tonnes de code.

Ca marche aussi trés bien d'envoyer des mail en ligne de commande, la manipulation d'image aussi (certe, il faut avoir les bons utilitaire) ... alors pourquoi donc inclure tout ça dans php? La réponse est simple : tout le monde n'a pas accés aux fonction tels qu' "exec" et ce pour des raisons évidentes de sécurité.

Reply

Marsh Posté le 12-10-2005 à 16:09:47    

DEns91 a écrit :

je viens d'alle faire un tour sur php.net, J'ai pas trop compris l'interret d'avoir integré sa à PHP. Sa marche parfaitement en ligne de commande je vois pas pourquoi ce prendre la tète a écrire 3 tonnes de code.


Il est marrant lui :D

Reply

Marsh Posté le 12-10-2005 à 17:23:39    

Hop Hop ! On pourrit pas mon poste please !  :non:  
 
Dite moi plutot comment reccuperer les attributs de la balise en XSL (cms_id et name), c'est plus utile !  :)  
  <item_group cms_id="6527" name="Pulsar Evolution rackable">
 
------------------------
Bon j'ai trouvé, c'est bidon !  :D  
<xsl:value-of select="./@cms_id"/>


Message édité par djfx le 12-10-2005 à 17:27:53

---------------
Pas oublier les glacons pour l'apero !!
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed