Ci-joint le script complet :
<?php
header('Content-Type: text/html; charset=utf-8');
// Fichier à analyser
$file = "code.xml";
// variable de la profondeur du parcours de l'arbre
$depth = array();
// Etat de la pile de parcours du document XML
$stack = array();
//... Ouverture de la base de donnes...
require("login.php");
$db_link = mysql_connect($MySQL_Host,$MySQL_User,$MySQL_Passwd)
or die("Impossible de se connecter : " . mysql_error());
$requete=mysql_db_query($db,"SET NAMES utf8;",$db_link);
// Valeur d'un dernier élément lu
$globaldata ="";
$entreeCourante="";
$orthValue ="";
$posValue=array();
$genValue=array(array());
$numberValue=array(array(array()));
$subcValue=array(array(array(array())));
$tnsValue="";
$moodValue="";
$nb_code="";
$isn="";
$geoValue=array();
$authorValue=array();
$titleValue=array();
// Fonction associée à l’événement début d’élément
function startElement($parser, $name, $attrs)
{
global $depth;
global $stack;
global $entreeCourante ;
global $globaldata;
global $isn;
// print "<br/>";
for ($i = 0; $i < $depth[$parser]; $i++)
{
// print " ";
}
array_push($stack,$name);
$depth[$parser]++;
// print "Début de l'élément : ".$name."\n -- ";
// print "profondeur : ".$depth[$parser]." -- Attributs de l'élément : ";
//affichage des attributs de l'élément
switch ($name){
case "entry":
while (list($key,$val)=each($attrs))
{
$isn=$val;
}
$entreeCourante="";
break;
}
}
// Fonction associée à l’événement fin d’élément
function endElement($parser, $name)
{
global $depth;
global $stack;
global $globaldata;
global $entreeCourante;
global $orthValue;
global $isn;
global $posValue;
global $genValue;
global $numberValue;
global $subcValue;
global $tnsValue;
global $moodValue;
global $geoValue;
global $authorValue;
global $titleValue;
global $db;
global $db_link;
global $nb_code;
for ($i = 0; $i < $depth[$parser]-1; $i++) {
}
// print "Fin de l'élément : '".$name."' avec la valeur :".$globaldata." -- ";
// print "profondeur : ".$depth[$parser]." ";
$globalData2=$globaldata;
// on supprime toutes les tabulations, les retours charriotset on double les quotes
$globalData2=str_replace("'", "''",$globalData2);
$globalData2=str_replace("\t", "",$globalData2);
$globalData2=str_replace("\n", "",$globalData2);
// On supprime tous les espaces devant la chaine de caractères.
while (substr($globalData2,0,1)==" ") $globalData2=substr($globalData2,1,strlen($globalData2)-1);
// On supprime tous les espaces insérés dans la chaine de caractères, dus à un saut à la ligne dans les données
$globalData2=str_replace(" ","@",$globalData2);
$globalData2=str_replace("@@","#",$globalData2);
$globalData2=str_replace("##","@",$globalData2);
$globalData2=str_replace("@@","#",$globalData2);
$globalData2=str_replace("##","@",$globalData2);
$globalData2=str_replace("@@","#",$globalData2);
$globalData2=str_replace("##","@",$globalData2);
$globalData2=str_replace("@@","#",$globalData2);
$globalData2=str_replace("##","@",$globalData2);
$globalData2=str_replace("@"," ",$globalData2);
$globalData2=str_replace("#"," ",$globalData2);
$entreeCourante.=$globalData2."</".$name.">";
$depth[$parser]--;
switch ($name) {
case "orth":
$orthValue=$globalData2;
break;
case "pos":
$posValue[]=$globalData2;
break;
case "gen":
$genValue[]=$globalData2;
break;
case "number":
$numberValue[]=$globalData2;
break;
case "subc":
$subcValue[]=$globalData2;
break;
case "tns":
$tnsValue=$globalData2;
break;
case "mood":
$moodValue=$globalData2;
break;
case "usg":
$geoValue[]=$globalData2;
break;
case "author":
$authorValue[]=$globalData2;
break;
case "title":
$titleValue[]=$globalData2;
break;
case "entry":
$isn=$isn;
$entreeCourante=str_replace("&","&",$entreeCourante);
$requete=mysql_db_query($db,"insert into entry Values('','$isn','$orthValue')",$db_link)
or die (" Erreur n".mysql_errno()." Problème d'enregistrement dans la base, table entry ".mysql_error());
$num_entry=mysql_insert_id();
$isn="";
for($i=0;$i<sizeOf($geoValue);$i++)
{
$requete=mysql_db_query($db,"insert into usg Values('','$num_entry','$geoValue[$i]')",$db_link)
or die (" Erreur n".mysql_errno()." Problème d'enregistrement dans la base, table usg ".mysql_error());
}
$geoValue = array();
for($i=0;$i<sizeOf($authorValue);$i++)
for($i=0;$i<sizeOf($titleValue);$i++)
{
$requete=mysql_db_query($db,"insert into bibl Values('','$num_entry','$authorValue[$i]','$titleValue[$i]')",$db_link)
or die (" Erreur n".mysql_errno()." Problème d'enregistrement dans la base, table bibl ".mysql_error());
}
$authorValue = array();
$titleValue=array();
for($i=0;$i<sizeOf($posValue);$i++)
for($p=0;$p<sizeOf($genValue);$p++)
{
if (sizeOf($genValue[$p])==0) {
$requete=mysql_db_query($db,"insert into code (codeId, entryId,pos, tns, mood) Values('','$num_entry','$posValue[$i]','$tnsValue','$moodValue')",$db_link)
or die (" Erreur n".mysql_errno()." Problème d'enregistrement dans la base, table code ".mysql_error());
}
else {$requete=mysql_db_query($db,"insert into code (genre) values('$genValue[$p]')", $db_link);}
}
$posValue=array();
$genValue=array(array());
$numberValue=array(array(array()));
$subcValue=array(array(array(array())));
$tnsValue="";
$moodValue="";
break;
break;
default:
}
$globaldata="";
array_pop($stack);
}
// Fonction associée à l’événement données textuelles
function characterData($parser, $data)
{
global $globaldata;
$globaldata = $globaldata.$data;
}
// Fonction associée à l’événement de détection d'un appel d'entité externe
function externalEntityRefHandler($parser,
$openEntityNames,
$base,
$systemId,
$publicId)
{
if ($systemId)
{ if (!list($parser, $fp) = new_xml_parser($systemId))
{
printf("Impossible d'ouvrir %s à %s\n",
$openEntityNames,
$systemId);
return FALSE;
}
while ($data = fread($fp, 4096))
{
if (!xml_parse($parser, $data, feof($fp)))
{
printf("Erreur XML : %s à la ligne %d lors du traitement de l'entité %s\n",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser),
$openEntityNames);
xml_parser_free($parser);
return FALSE;
}
}
xml_parser_free($parser);
return TRUE; } return FALSE;
}
// Fonction de création du parser et d'affectation
// des fonctions aux gestionnaires d'événements
function new_xml_parser($file)
{
global $parser_file;
//création du parseur
$xml_parser = xml_parser_create();
//Activation du respect de la casse du nom des éléments XML
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
//Déclaration des fonctions à rattacher au gestionnaire d'événement
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
//Ouverture du fichier
if (!($fp = @fopen($file, "r"))) { return FALSE; }
//Transformation du parseur en un tableau
if (!is_array($parser_file))
{ settype($parser_file, "array"); }
$parser_file[$xml_parser] = $file;
return array($xml_parser, $fp);
}
// Appel à la fonction de création et d'initialisation du parseur
if (!(list($xml_parser, $fp) = new_xml_parser($file)))
{ die("Impossible d'ouvrir le document XML"); }
// Traitement de la ressource XML
while ($data = fread($fp, 4096))
{
if (!xml_parse($xml_parser, $data, feof($fp)))
{ die(sprintf("Erreur XML : %s à la ligne %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
// Libération de la ressource associée au parser
xml_parser_free($xml_parser);
echo "<br/>génération des tables terminées";
function unhtmlentities ($string) {
$trans_tbl =get_html_translation_table (HTML_ENTITIES );
$trans_tbl =array_flip ($trans_tbl );
return strtr ($string ,$trans_tbl );
}
// On Met maintanant à jour le contenu de chaque entry...
// $file="../dico/pf.xml";
$count=0;
$dom = new DomDocument;
$dom->load($file);
$entriesList = $dom->getElementsByTagName('entry');
foreach ($entriesList as $entry) {
$count++;
$entryXml = $dom->saveXML($entry);
$entryXml=addslashes($entryXml) ;
$requete=mysql_db_query($db,"UPDATE entry SET entryValue='$entryXml' WHERE entryId=".$count."",$db_link) ;
}
mysql_close($db_link);
?>