Caractère spéciaux parsage document XML

Résolu/Fermé
djodjo49 Messages postés 20 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 12 juin 2012 - 5 juin 2012 à 15:39
djodjo49 Messages postés 20 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 12 juin 2012 - 12 juin 2012 à 14:44
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 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
5 juin 2012 à 15:55
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 12 juin 2012
5 juin 2012 à 16:02
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 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
5 juin 2012 à 16:15
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 12 juin 2012
5 juin 2012 à 16:17
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 5224 Date d'inscription samedi 20 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 1 353
5 juin 2012 à 17:05
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 12 juin 2012
6 juin 2012 à 09:38
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 12 juin 2012
12 juin 2012 à 14:44
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