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   -
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.
A voir également:

6 réponses

mpmp93 Messages postés 6648 Date d'inscription   Statut Membre Dernière intervention   1 340
 
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+
0
djodjo49 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
mpmp93 Messages postés 6648 Date d'inscription   Statut Membre Dernière intervention   1 340
 
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+
0
djodjo49 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
D'accord, merci quand même d'avoir consacré votre temps à essayé de m'aider.
Bonne journée à vous.

Cordialement.
0
RAD ZONE Messages postés 5230 Date d'inscription   Statut Contributeur Dernière intervention   1 360
 
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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
djodjo49 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
djodjo49 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0