Caractère spéciaux parsage document XML
Résolu
djodjo49
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
djodjo49 Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
djodjo49 Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'essaie de parser un document XML afin d'ajouter son contenu dans une bdd.
Jusque-là pas de problème, le test avec un fichier de 200mo avait fonctionné.
Ensuite on m'a donné un autre document XML et j'ai eu le message d'erreur suivant:
Warning: simplexml_load_file() [function.simplexml-load-file]: admin/TARIF_ok.XML:11366: parser error : PCDATA invalid Char value 26 in ***.php on line 36
Je me suis donc renseigné sur ce fameux caractère et il s'agit du "sub", bien présent dans la ligne 11366 du fichier XML. (il y en à une 30aine d'autres également)
(https://phpsources.net/caracteres-iso.htm
J'aimerais donc savoir s'il était possible de supprimer ce caractère lors du parsage.
J'ai bien testé:
$mon string=str_replace(chr(26), " ", $mon string);
Mais ça n'a pas fonctionné.
Je vous mets le code complet ci-dessous:
<?
session_start();
set_time_limit(0);
//on se connecte au serveur
$serveur = mysql_connect("***") or die("erreur de connexion au serveur ");
$db= mysql_select_db('test', $serveur);
//on vide la bdd
mysql_query("DELETE FROM tarif");
//on charge le document xml
$HF_DOCUMENT_xml = simplexml_load_file($fichier);
foreach ($HF_DOCUMENT_xml ->TARIF as $TARIF) {
$COCLEUNIK=$TARIF->COCLEUNIK;
$REFCONSTRU=$TARIF->REFCONSTRU;
$LIBELLEPIE=$TARIF->LIBELLEPIE;
$PRIXTARIF=$TARIF->PRIXTARIF;
$UNITEACHAT=$TARIF->UNITEACHAT;
$POIDSPIECE=$TARIF->POIDSPIECE;
//on remplace le ' par un espace
$LIBELLEPIE = str_replace("'", " ", $LIBELLEPIE);
//test d'enlever le caractère
$LIBELLEPIE = str_replace(chr(26), " ", $LIBELLEPIE);
//on insère dans la bdd
mysql_query("INSERT INTO tarif(COCLEUNIK, REFCONSTRU, LIBELLEPIE, PRIXTARIF, UNITEACHAT, POIDSPIECE) VALUES ('".$COCLEUNIK." ', '".$REFCONSTRU."', '".$LIBELLEPIE."' , '".$PRIXTARIF."', '".$UNITEACHAT."', '".$POIDSPIECE."')") or die("Erreur MySQL : ".mysql_error());
}
mysql_close($serveur);
?>
Merci à ceux qui veulent bien me répondre.
Cordialement.
J'essaie de parser un document XML afin d'ajouter son contenu dans une bdd.
Jusque-là pas de problème, le test avec un fichier de 200mo avait fonctionné.
Ensuite on m'a donné un autre document XML et j'ai eu le message d'erreur suivant:
Warning: simplexml_load_file() [function.simplexml-load-file]: admin/TARIF_ok.XML:11366: parser error : PCDATA invalid Char value 26 in ***.php on line 36
Je me suis donc renseigné sur ce fameux caractère et il s'agit du "sub", bien présent dans la ligne 11366 du fichier XML. (il y en à une 30aine d'autres également)
(https://phpsources.net/caracteres-iso.htm
J'aimerais donc savoir s'il était possible de supprimer ce caractère lors du parsage.
J'ai bien testé:
$mon string=str_replace(chr(26), " ", $mon string);
Mais ça n'a pas fonctionné.
Je vous mets le code complet ci-dessous:
<?
session_start();
set_time_limit(0);
//on se connecte au serveur
$serveur = mysql_connect("***") or die("erreur de connexion au serveur ");
$db= mysql_select_db('test', $serveur);
//on vide la bdd
mysql_query("DELETE FROM tarif");
//on charge le document xml
$HF_DOCUMENT_xml = simplexml_load_file($fichier);
foreach ($HF_DOCUMENT_xml ->TARIF as $TARIF) {
$COCLEUNIK=$TARIF->COCLEUNIK;
$REFCONSTRU=$TARIF->REFCONSTRU;
$LIBELLEPIE=$TARIF->LIBELLEPIE;
$PRIXTARIF=$TARIF->PRIXTARIF;
$UNITEACHAT=$TARIF->UNITEACHAT;
$POIDSPIECE=$TARIF->POIDSPIECE;
//on remplace le ' par un espace
$LIBELLEPIE = str_replace("'", " ", $LIBELLEPIE);
//test d'enlever le caractère
$LIBELLEPIE = str_replace(chr(26), " ", $LIBELLEPIE);
//on insère dans la bdd
mysql_query("INSERT INTO tarif(COCLEUNIK, REFCONSTRU, LIBELLEPIE, PRIXTARIF, UNITEACHAT, POIDSPIECE) VALUES ('".$COCLEUNIK." ', '".$REFCONSTRU."', '".$LIBELLEPIE."' , '".$PRIXTARIF."', '".$UNITEACHAT."', '".$POIDSPIECE."')") or die("Erreur MySQL : ".mysql_error());
}
mysql_close($serveur);
?>
Merci à ceux qui veulent bien me répondre.
Cordialement.
6 réponses
-
Bonjour,
Avant de faire ceci:
simplexml_load_file()
vous faites:
$filename='monfichier.xml';
$monFichier = file_get_contents($filename);
$search = 'X' // remplacer X par chaine à rechercher
$replace = 'Y' // remplacer Y par chaine à remplacer
$outFile = str_replace($search, $replace, $monFichier);
$xml = simplexml_load_string($outFile);
A+
-
Merci de votre réponse.
Après avoir rajouter votre code:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 595544776 bytes) in ***.php on line 38
La ligne 38: $monFichier = file_get_contents($filename);
J'ai oublié de préciser que le fichier XML pèse 586mo.-
cherchez pas....
Vous y arriverez pas....
Car même avec simplexml_load_file vous aurez le même problème.
il y aurait quand même une solution....
C'est d'ouvrir le fichier xml, en lecture seule,
puis de le lire ligne à ligne,
voir si la ligne contient ce caractère qui vous embête,
et réécrire dans un autre fichier toutes les lignes lues, y compris celles corrigées...
voir ces fonctions:
fgets() et fputs()
ATTENTION, il faut gérer deux tickets (handle) de fichiers distincts:
un ticket pour le fichier origine en lecture seule
un ticket différent pour réécrire dans un autre fichier via fputs()
Après cette manoeuvre essayez le simplexml_load_file, mais je pense que le souci d'allocation mémoire perdurera
A+
-
-
D'accord, merci quand même d'avoir consacré votre temps à essayé de m'aider.
Bonne journée à vous.
Cordialement. -
Salut
tu peux essayer cette solution ! mais rien ne dis que ca fonctionnera ??
plus de 500Mo c est quand meme enorme !
1 : il faut modifier le php.ini
tu modifie ou ajoute
memory_limit = 1024M
pas de o apres le M !!!
512 pas assez pour ton fichier alors on essaye 1024
2 : Si tu ne peux pas modifier le php.ini
tu ajoute cette ligne au .htaccess
php_value memory_limit 1024M
encore une fois , je ne garantie pas que ca passe !
mais rien n empeche d essayer !
A+ -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour,
Je n'ai pas accès au .ini, j'ai donc rajouté la ligne proposée au .htaccess mais ça n'a pas fonctionné.
J'ai également rajouté ini_set('memory_limit','1024M') qui ne marchait guère mieux.
Je pense donc que je vais essayé de réduire la taille du XML.
Merci encore pour vos réponses et bonne journée.
Cordialement. -
Bonjour,
Je me permet de remonter le sujet car j'ai finalement eu accès au php.ini.
j'ai modifié memory_limit = 1024M
Je pensais enfin tenir le bon bout et lors de l'exécution:
Fatal error: Allowed memory size of 1 073 741 824 bytes exhausted (tried to allocate 595 544 776 bytes) in *** on line 44
La ligne 44:
$outFile = str_replace($search, $replace, $monFichier);
Donc je me suis dit qu'il fallait peut-être deux fois les 595 544 776M du fichier XML
J'ai donc mis dans le php.ini:
memory_limit = 2048M
Et le résultat est le suivant:
Fatal error: Out of memory (allocated 595 853 312) (tried to allocate 595 544 776 bytes) in *** on line 44
Si quelqu'un voit de quoi il s'agit...
Cordialement.