pb utilisation fonction simple xml

nounet
Invité n'ayant pas de compte PHPfrance

12 déc. 2007, 19:48

Bonjour a tous

voici un resumé de la situation ,j'ouvre un fichier xml avec la fonction simplexml_load_file
je transforme ensuite ce fichier xml en une chaine de caractere a l'aide de la fonction as xml tel que :
define('ERROR_TO_CONVERT_DOCXML_IN_STRING','le fichier content.xml n\'a pu etre converti en chaine de caractere');
$oXml=simplexml_load_file('mon fichier.xml');
     				if($this->content = $oXml->asXML()=== FALSE){
					  throw new Exception (ERROR_TO_CONVERT_DOCXML_IN_STRING);


					 }
en effet la document tationtechnique dit qu'elle retourne une chaine de caractere

ensuite je remplace des variables type tel que {mavar} par des valeurs
$this->content = str_replace(array_keys($this->vars), array_values($this->vars), $this->content);
mais comment procede ton maintenant pour enregistrer ma chaine de caractere xml en un fichier xml
Dois ton obligatoirement passer par dom (j'ai vu quelque chose du genre
$doc->save()
et si oui avez vous une idée de code a me proposer?
merci d'avance de toutes vos remarques

Mammouth du PHP | 2937 Messages

12 déc. 2007, 20:14

Avec la méthode asXml (), tu peux enregistrer ta chaîne XML dans un fichier : il suffit de préciser entre les parenthèses l'URI ou le nom du fichier.
$this -> content -> asXml ('fichier_modifie.xml');

nounet
Invité n'ayant pas de compte PHPfrance

12 déc. 2007, 20:59

j'aibine essayé ce que tu m'as dit mais j'ai un probleme

$this->content =str_replace(array_keys($this->vars), array_values($this->vars), $this->content);
$oXml = simplexml_load_string($this->content);
				$oXml->asXML('nouveaufichier.xml');
j'otiens le message suivant "Call to a member function asXML() on a non-object ".

pourtant la prmeiere fonction permet de charger une chaine xml qui est bien contenu dans mon
$this->content
j'ai aussi essayer d'utiliser la syntaxe suivante :
$oXml= new SimpleXMLElement($this->content);
$oXml->asXML('nouveaufichier.xml');
j'obtiens alors le message d'erreur suivant

String could not be parsed as XML.

je ne comprend pas trop l'erreur car au tout debut j'ai convertit un fichier en une chaine xml valide.je fais mes changements ,je recharge cette chaine que je souhauite ensuite enregistrer.
OU serait l'errreur ,peut etre n'utilisai je pas le les bonnes fonctions??
[/php]

Mammouth du PHP | 2937 Messages

12 déc. 2007, 21:52

Essaie de procéder ainsi :
<?php 
// Chargement du fichier XML de départ
$xml = simplexml_load_file ('fichier-depart.xml');

// Passage sous forme de chaîne
$chaine_xml = $xml -> asXml ();

// Tu fais tes traitements
...

// Tu enregistres le tout sous un nouveau fichier
$chaine_xml -> asXml ('fichier-arrivee.xml');
?>
Une question : d'où sort le $this -> vars ? Le problème viendrait-il de là ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

12 déc. 2007, 22:15

Attendez un instant, si $this->content est une chaîne, alors inutile de la retransformer en XML pour la sauvegarder, file_put_contents() le fera très bien.

D'un autre côté, cette question soulève un point important : si simplexml_load_string() ne renvoit pas un objet c'est que ta chaîne n'est pas du XML valide, probablement à cause du str_replace(). Idéalement, tu devrais effectuer ces remplacements sur l'arbre XML lui-même, pas sur sa représentation texte. Donc soit par XSLT soit en inspectant chaque nœud et en effectuant les remplacements sur chaque nœuds séparément, ce qui peut malheureusement prendre énormément de temps.

nounet
Invité n'ayant pas de compte PHPfrance

13 déc. 2007, 00:32

j'avais justement pensé a utiliser les deux fonctions file_put_contents et file_get_contents quiaurait pu me permettre d'eviter tous ces desagrments mais cependant je me demandais comment verifier que ces focntions etaient bien disponibles.j'ai passé mon site perso sous free en php5 mais suit incapable de savoir si ces deux fonctions sont bien disponible.
j'avais crée la fonction suivante

define('ERROR_TO_CONVERT_DOCXML_IN_STRING','le fichier content.xml n\'a pu etre converti en chaine de caractere');
define('ERROR_TO_CONVERT_STRING_IN_DOCXML','la chaine de caractere validé n\'a pu etre sauvegardé en un fichier xml');

if($this->scontent = file_get_contents('content.xml') === FALSE ){
						throw new Exception (ERROR_TO_CONVERT_DOCXML_IN_STRING);
					}
	$this->scontent = str_replace(array_keys($this->vars), array_values($this->vars), $this->scontent);
if($this->sNomFinal= file_put_contents('content.xml',$this->content) === FALSE){
					throw new Exception (ERROR_TO_CONVERT_STRING_IN_DOCXML);
				}
mais celle ci me renvoyait la deuxiemem exception 
Quelqu'un sait il pourquoi?
merci deja de voslumieres

Mammouth du PHP | 2937 Messages

13 déc. 2007, 10:01

C'est simple :
<?php
$get_contents = (function_exists ('file_get_contents'))? 'oui': 'non';
$put_contents = (function_exists ('file_put_contents'))? 'oui': 'non';
echo 'file_get_contents : '.$get_contents."\n".'file_put_contents : '.$put_contents;
?>
Ou alors un coup de phpinfo () et tu scrutes la ligne disable_functions. :wink: