Importer un fichier xml vers une BDD Mysql ?

Importer un fichier xml vers une BDD Mysql ? - PHP - Programmation

Marsh Posté le 13-09-2005 à 13:20:23    

voila, j'ai un logiciel professionnel qui va me déposer un fichier xml sur le serveur ftp de l'hebergeur.  
 
 
 
J'aimerais parser le fichier pour importer toutes les données dans ma base de données MySQL. L'utilisateur se rendra sur une page d'admin du site et cliquera sur un bouton "Import" pour importer les données du fichier xml.
 
 
 
J'ai vu qu'il existait des commandes toutes faites : DOM XML
 
Mais je ne comprends pas du tout, il y a des fonctions propres au navigateur ?  
http://www.w3schools.com/dom/dom_parser.asp ==> voici des fonction qui ne fonctionnent avec IE.
http://www.w3schools.com/dom/tryit [...] arsertest2 ==> voici un exemple qui ne fonctionne qu'avec IE
 
Auriez vous un exemple, qui chargerait un fichier php, qui chargerait un fichier xml et qui le paserer ?

Reply

Marsh Posté le 13-09-2005 à 13:20:23   

Reply

Marsh Posté le 13-09-2005 à 13:48:23    

bon en fait j'ai trouver des commandes interessantes : domxml_open_file qui me permettrait justement de charger un fichier xml sans se soucier du navigateur.
 
J'ai repris l'exemple de php.net :
http://fr.php.net/manual/fr/functi [...] n-file.php
 

<?php
 
if(!$dom = domxml_open_file("exemple.xml" )) {
  echo "Erreur lors de l'analyse du document\n";
  exit;
}
 
$root = $dom->document_element();
?>

 
 
mais cela ne semble pas fonctionner :

Citation :


Warning: domxml_open_file(): I/O in c:\program files\easyphp1-8\www\xmltext.php on line 3
 
Warning: domxml_open_file(): warning : in c:\program files\easyphp1-8\www\xmltext.php on line 3
 
Warning: domxml_open_file(): failed to load external entity "exemple.xml" in c:\program files\easyphp1-8\www\xmltext.php on line 3
Erreur lors de l'analyse du document


 
 
J'ai activer le domxml sous easyphp. Maintenant j'ai le meme phpinfo que mon herbergeur : http://www.online.net/support/fr/doc/php4/phpinfo.html
 
Le fichier xml est bien entendu dans le meme repertoire que mon script php.
 
fichier xml :
 

<?xml version="1.0" encoding="windows-1252"?>
<BIENS>
<BIEN>
 <CODE_CLIENT>XXX</CODE_CLIENT>
 <TYPE_OFFRE>2</TYPE_OFFRE>
        ...........
</BIEN>
........
</BIENS>


Pourquoi cette erreur ?
Que cela signifie t'il ?
 
 

Reply

Marsh Posté le 13-09-2005 à 13:49:13    

En PHP4 et inférieur, utiliser les fonctions DOM de php. (voir la doc php)
On s'en fiche alors de l'implémentation DOM des navigateurs.
 
En PHP5 et supérieur t'as simpleXML qui s'utilise trés facilement et qui te permettra de traiter le fichier beaucoup plus facilement. :)

Reply

Marsh Posté le 13-09-2005 à 14:17:06    

Pour parser un fichier XML en PHP il y a 2 Methodes, la DOM et la SAX. je sais pas qu'elle est la meilleur. Perso j'ai toujours utilisé la methode SAX que je trouve plus simple a comprendre.
 
Je te propose un exemple de code pour parser ton XML mais en methode SAX, il est a amélioré et a indenté j'ai tapé ca rapidement. j'espère que je n'ai pas ecrit trop de conneries
 
Tu nous dis que ton XML est du style ::
 
<?xml version="1.0" encoding="windows-1252"?>
<BIENS>
<BIEN>
 <CODE_CLIENT>XXX</CODE_CLIENT>
 <TYPE_OFFRE>2</TYPE_OFFRE>
</BIEN>
<BIEN>
 <CODE_CLIENT>ZZZ</CODE_CLIENT>
 <TYPE_OFFRE>5</TYPE_OFFRE>
</BIEN>
</BIENS>
 
<?php
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;
 }        
}
 
 
 
// XML - End Element
function endElement($parser, $name) {    
 global $buffer;
   global $cpt_bien;
 global $tab_resultats;
 
 switch($name) {
   case "CODE_CLIENT" : $tab_resultats[$cpt_bien]["client"] = $buffer; break;
      case "TYPE_OFFRE" : $tab_resultats[$cpt_bien]["type"] = $buffer; break;          
   }
   
 if( $name == "BIEN" ) {
   $cpt_bien++;      
    $buffer = '';          
   }                
}  
 
 
 
// XML - Character Data
function characterData($parser, $value) {
  global $buffer;  
  $buffer .= $value;      
}  
 
 
 
$fichierXML = "parseur.xml";
 
 
if(!($fp = fopen($fichierXML, "r" )))
{
  die("Fichier ".$fichierXML." non disponible" );
}
 $reponse_xml = fread($fp,filesize($fichierXML));
 
  $xml_parser = xml_parser_create();
  xml_set_element_handler($xml_parser, "startElement", "endElement" );
  xml_set_character_data_handler($xml_parser, "characterData" );
 
  if(!xml_parse($xml_parser, $reponse_xml)) {
   echo "erreur parse";
    die(xml_error_string(xml_get_error_code($xml_parser)));  
  }    
 
  xml_parser_free($xml_parser);
 
  $tab_resultats["nbr"] = $cpt_bien;  
  echo "<pre>";
  print_r($tab_resultats);
  echo "</pre>";
?>

Message cité 1 fois
Message édité par DEns91 le 13-09-2005 à 14:23:20
Reply

Marsh Posté le 13-09-2005 à 15:32:18    

oula, je m'attendais pas à un tel poste, mille merci Dens91
 
je viens de le tester et ca fonctionne à merveille

Reply

Marsh Posté le 13-09-2005 à 15:40:29    

weed a écrit :


J'ai repris l'exemple de php.net :
http://fr.php.net/manual/fr/functi [...] n-file.php
[...]
 
mais cela ne semble pas fonctionner :
[...]
 
Pourquoi cette erreur ?
Que cela signifie t'il ?


 
Quand tu lis un truc dans la doc PHP, n'oublie jamais de lire les commentaires en dessous. Faut savoir que la doc PHP, surtout pour DOMXML est nulle à chier. Si tu aurais lu, tu aurais pu voir ça :

Citation :

Using PHP 4.2.3 and Win2K.
 
The XML file needs to be referenced using the full filesystem path name, even if its in the same directory.


 

Citation :

If you want to work on both Windows and Linux, I found appending the following to the front of your file path works:
 
$xmlPath = dirname(__FILE__) . "/";
$xmlDOM = domxml_open_file($xmlPath . "file.xml" );
 
(rather than the "\\" in a previous post on this page which only works on Windows).
 
This should get around the I/O errors.

Reply

Marsh Posté le 13-09-2005 à 16:02:46    

weed a écrit :

oula, je m'attendais pas à un tel poste, mille merci Dens91
 
je viens de le tester et ca fonctionne à merveille


 
Mais de rien, je m'ennui un peu a mon taf  :sleep: , mon chef de projet [:alfinfrance] estime très mal le temps qu'il me faut pour developper. Donc je m'occupe comme je peux!!


Message édité par DEns91 le 13-09-2005 à 16:03:11
Reply

Marsh Posté le 06-11-2006 à 16:01:41    

Bonjour, je suis un peu dans le meme cas que vous, je suis webmaster et je bosse avec des agences immobilieres, je souhaite importer des données provennat de logiciels de transaction comme pericles ou transtel (fnaim)
je cherche des infos dans ce sens
avez vous  
un moment pour en discuter
 
cordialement : le responsable d'index-immo.com
 
 

weed a écrit :

voila, j'ai un logiciel professionnel qui va me déposer un fichier xml sur le serveur ftp de l'hebergeur.  
 
 
 
J'aimerais parser le fichier pour importer toutes les données dans ma base de données MySQL. L'utilisateur se rendra sur une page d'admin du site et cliquera sur un bouton "Import" pour importer les données du fichier xml.
 
 
 
J'ai vu qu'il existait des commandes toutes faites : DOM XML
 
Mais je ne comprends pas du tout, il y a des fonctions propres au navigateur ?  
http://www.w3schools.com/dom/dom_parser.asp ==> voici des fonction qui ne fonctionnent avec IE.
http://www.w3schools.com/dom/tryit [...] arsertest2 ==> voici un exemple qui ne fonctionne qu'avec IE
 
Auriez vous un exemple, qui chargerait un fichier php, qui chargerait un fichier xml et qui le paserer ?


Reply

Marsh Posté le 29-05-2009 à 12:05:00    

C'est effectivement la solution la plus simple que j'ai croisé pour l'instant.
cela fonctionne-t-il pour le fichier xml comportant un arborescence plus profonde.  
je suis confronté a un cas très similaire au xml proposé ds ce sujet mais avec par exemple un noeud Image en plus.
J'ai modifié l'exemple pour être plus clair
<?xml version="1.0" encoding="windows-1252"?>
<BIENS>
<BIEN>
 <CODE_CLIENT>XXX</CODE_CLIENT>
 <TYPE_OFFRE>2</TYPE_OFFRE>
</BIEN>
<BIEN>
 <CODE_CLIENT>ZZZ</CODE_CLIENT>
 <TYPE_OFFRE>5</TYPE_OFFRE>
 <IMAGES>
     <IMAGE id="0">/dir/image.jpg</IMAGE>
     <IMAGE id="1">/dir/picture.jpg</IMAGE>
...
  <IMAGE id="n">blabla.png</IMAGE>
</IMAGES>
</BIEN>
</BIENS>  
 
je ne vois pas comment implémenté une 'sous famille' comme cela ds le jolie code que tu as fais.
 
Merci ^^
 

Reply

Marsh Posté le 17-07-2009 à 10:33:34    

DEns91 a écrit :

Pour parser un fichier XML en PHP il y a 2 Methodes, la DOM et la SAX. je sais pas qu'elle est la meilleur. Perso j'ai toujours utilisé la methode SAX que je trouve plus simple a comprendre.
 
Je te propose un exemple de code pour parser ton XML mais en methode SAX, il est a amélioré et a indenté j'ai tapé ca rapidement. j'espère que je n'ai pas ecrit trop de conneries

Spoiler :


Tu nous dis que ton XML est du style ::
 
<?xml version="1.0" encoding="windows-1252"?>
<BIENS>
<BIEN>
 <CODE_CLIENT>XXX</CODE_CLIENT>
 <TYPE_OFFRE>2</TYPE_OFFRE>
</BIEN>
<BIEN>
 <CODE_CLIENT>ZZZ</CODE_CLIENT>
 <TYPE_OFFRE>5</TYPE_OFFRE>
</BIEN>
</BIENS>
 
<?php
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;
 }        
}
 
 
 
// XML - End Element
function endElement($parser, $name) {    
 global $buffer;
   global $cpt_bien;
 global $tab_resultats;
 
 switch($name) {
   case "CODE_CLIENT" : $tab_resultats[$cpt_bien]["client"] = $buffer; break;
      case "TYPE_OFFRE" : $tab_resultats[$cpt_bien]["type"] = $buffer; break;          
   }
   
 if( $name == "BIEN" ) {
   $cpt_bien++;      
    $buffer = '';          
   }                
}  
 
 
 
// XML - Character Data
function characterData($parser, $value) {
  global $buffer;  
  $buffer .= $value;      
}  
 
 
 
$fichierXML = "parseur.xml";
 
 
if(!($fp = fopen($fichierXML, "r" )))
{
  die("Fichier ".$fichierXML." non disponible" );
}
 $reponse_xml = fread($fp,filesize($fichierXML));
 
  $xml_parser = xml_parser_create();
  xml_set_element_handler($xml_parser, "startElement", "endElement" );
  xml_set_character_data_handler($xml_parser, "characterData" );
 
  if(!xml_parse($xml_parser, $reponse_xml)) {
   echo "erreur parse";
    die(xml_error_string(xml_get_error_code($xml_parser)));  
  }    
 
  xml_parser_free($xml_parser);
 
  $tab_resultats["nbr"] = $cpt_bien;  
  echo "<pre>";
  print_r($tab_resultats);
  echo "</pre>";


?>


 
Bonjour à tous, je souhaiterai savoir si quelqu'un peut me décrire un petit peu le fonctionnement du code ci dessus car je sens bien que c'est ce que je cherche mais je ne suis vraiment pas familier de la syntaxe php donc je pige pas grand chose ^^
 
Si quelqu'un peut me communiquer un lien ou m'expliquer ça, vous seriez bien sympas!
 
Merci


---------------
"S'il existe des gens capables, il suffit de produire l'effort pour devenir capable."
Reply

Sujets relatifs:

Leave a Replay

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