Caractère spéciaux parsage document XML
Résolu
djodjo49
Messages postés
20
Date d'inscription
Statut
Membre
Dernière intervention
-
djodjo49 Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
djodjo49 Messages postés 20 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.
A voir également:
- Caractère spéciaux parsage document XML
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Caractere speciaux mac - Guide
- Caractère ascii - Guide
- Xml download - Télécharger - Édition & Programmation
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+
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.
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+
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.
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
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
encore une fois , je ne garantie pas que ca passe !
mais rien n empeche d essayer !
A+
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 = 1024Mpas 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.
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.
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.