Page 1 sur 1

Probleme pour parser un XML qui arrive d'un SWF...

Posté : 25 août 2005, 15:45
par JoGoiA
Voila, j'ai trouvé un script que j'ai adapté pour parser un XML reçu en _POST depuis le SWF qui l'a généré.
J'ai bidouillé le truc pour faire ce que je veux (en faire un tableau HTML);

Le truc fonctionne trés bien sous easyPHP mais il ne se passe plus rien dés que je suis en ligne.

j'ai fait des petits phpinfos et je suis en php5 sur mon serveur et 4.7.3.1 sur easy...
Sur les deux, j'ai le m^me expat et XML est bien activé partout...

je vous mets le code de ma page :
<?php
$fichier=$_POST['xmlImprimer'];
	

function decoder($texte){
	$texte = str_replace(">", ">", $texte);
	$texte = str_replace("<", "<", $texte);
	$texte = str_replace("%2D", "-", $texte);
	$texte = str_replace("%20", " ", $texte);
	return $texte;
}	


class xml  {
   var $parser;

   function xml()  // constructor
   {
       $this->parser = xml_parser_create();

       xml_set_object($this->parser, $this);
       xml_set_element_handler($this->parser, "tag_open", "tag_close");
    }

   function tag_open($parser, $tag, $attributes) {
   		
   	 	if ($tag != "RACINE" && $attributes["NOM"]!= "") {
		echo " <br/>     balise ouvrante";
		
			echo "	<td>IMAGE</td> 
				 	<td align='center' valign='middle'>".decoder($attributes['NOM'])."</td>
	 				<td align='center' valign='middle' bgcolor='#F5F7EE'>prix €</td>
	 				<td align='center' valign='middle'>".$attributes["QUANTITE"]."</td>
	 				<td align='center' valign='middle' bgcolor='#F5F7EE'>produit €</td></tr>
					<tr>
      				<td colspan='5'><img src='file:///G|/EasyPHP1-7/www/atribu/images/trait.gif' width='100%' height='2'></td>
    				</tr>";
	   	}else {
			echo "<br/>             balise non valide";
		}
   }

   function tag_close($parser, $tag)
   {
   		echo "...      fermée";
   }

  
   function parse($data)
   {
   		echo "debut du parse";
       	xml_parse($this->parser, $data);
   }

} // end of class xml




echo "
<body>
<div align='center'> 
  <table width='532'  border='0'> 
  <tr align='center' bgcolor='#DCE1C1'>
      <td width='80' class='Style1'>photo</td>
      <td width='235' bgcolor='#DEE3C6' class='Style1'>nom</td>
      <td width='65' class='Style1'>prix</td>
      <td width='65' class='Style1'>Quantit&eacute;</td>
      <td width='65' class='Style1'>total</td>
    </tr> 
  <tr>
  <td colspan='5'><img src='trait.gif' width='100%' height='2'></td>
  </tr>
  <tr> ";
  
$xml_parser = new xml();  // creation of the objet
$xml_parser->parse("$fichier");

echo "</table>";
 

?>

 

grace aux petits echos : "balise non valides", "balise ouvrante", "... fermée", je vois mieux ce qui se passe :

Avec mon serveur local, ça me retourne :
- debut du parse
- balise non valide
- balise non valide ... fermée
- balise ouvrante ... fermée
- balise ouvrante ... fermée
- ... fermée

normal, quoi...
mais dés que le script est en ligne, j'ai (pour un XML identique) :
- debut du parse
- balise non valide

Et c'est tout !
Donc ce n'est pas un probléme de récupérer le XML, il s'arréte aprés le tag <RACINE>...

Pourquoi ?
Vraiment, je ne vois pas.

Je tiens à dire que le XML est construit avec un premier noeud vide qui contient tout les attribut utiles mais vide qui a été cloné puis "rempli" sous flash. C'est ce qui explique la condition un peu particuliere :
if ($tag != "RACINE" && $attributes["NOM"]!= "") {
...
Si je la transforme un peu pour qu'il ignore seulement la racine mais pas ce noeud vide, le résultat est le même.
si je retire carrement la condition, il dessine une première ligne du tableau (pour le tag racine...) mais ne peut rien remplir et s'arréte.

Bref, je ne sais pas ce qui coince mais ça coince partout, sauf en local...

Pour ceux que ça intéresse, j'ai fait un petit ZIP avec une version simplifiée à l'extréme du probléme.
Vous le trouverez derriere ce lien
il y a dedans, un swf qui envoie a une version nettoyée de ma page PHP le XML qu'il load de puis un fichier (vous pouvez donc le voir aussi...)

voila, j'aimerai vraiment qu'on m'aide, je bloque sur un truc que je croyait fini depuis longtemps et c'est vraiment...

](*,)

Posté : 26 août 2005, 14:35
par JoGoiA
Bon...
En fait, je voudrais essayer avec simpleXML puisqu'il s'averre que ce truc est désormais installé sur mon serveur à la place de expat...

voici la mon XML :

Code : Tout sélectionner

<RACINE> <MODELE NOM="" QUANTITE="" /> <MODELE NOM="AT%2Dplage1%2Djaune" QUANTITE="4" /> <modele NOM="SERENGETI%20Bleu" QUANTITE="1" /> </RACINE>
Et voici le code php glané sur plusieurs tutoriaux :
<?php
$string = <<<XML
<?xml version='1.0'?>
<document>
 <title>Forty What?</title>
 <from>Joe</from>
 <to>Jane</to>
 <body>
  I know that's the answer -- but what's the question?
 </body>
</document>
XML;
$xml = simplexml_load_string($string);

var_dump($xml);
?> 
Moi, tout ce que je veux, c'est bosser sur une string reçue en post...
j'essaye donc :
$string = $_POST['xmlImprimer'];
$xml = simplexml_load_string('$string');

var_dump($xml);
Mais là, j'ai une erreur :
Warning: Entity: line 1: parser error : Start tag expected, '<' not found in /mnt/sites/atribu-online.com/web/testXML/imprimerXML.php on line 40

Warning: $string in /mnt/sites/atribu-online.com/web/testXML/imprimerXML.php on line 40

Warning: ^ in /mnt/sites/atribu-online.com/web/testXML/imprimerXML.php on line 40
bool(false)
le bool(false) est le résultat du varDump... la fonction simplexml_load_string('$string') fait donc une erreur.

Pourtant, si je fais un echo ('$string); je retrouve bien mon XML dans le code source de ma page... avec la balise RACINE bien encadrée de ses <..>. Je ne comprend donc pas pourquoi la premiére erreur : Entity: line 1: parser error : Start tag expected, '<' not found in

Alors, je regarde attentivement le code d'exmple qui fonctionne et je constate qu'il y a <<<XML <?xml version='1.0'?> ... XML; "autour" du texte a proprement parlé...

J'essaye donc un truc du genre :
$recup = $_POST['xmlImprimer'];
$string = "<<<XML <?xml version='1.0'?>";
$string .= $recup;
$string .= "XML";

$xml = simplexml_load_string('$string');

var_dump($xml);
et le résultat est toujours le même.
Je lis la doc dans tous les sens et tout le monde est d'accord pour dire que simpleXML est trés facile a utilisé mais là, je bloque dés le début...

Pourquoi ?
Pourquoi ??
POURQUOI ???

#-o #-o #-o

Tout ce que je veux, c'est pouvoir faire un joli tableau avec ce XML qui arrive dans $_POST ! Ca devrait pas si compliqué...

Posté : 01 oct. 2006, 11:37
par Cyrano
Ce sujet est remonté à la surface par un spam que j'ai viré, néanmoins, je note une chose :
$recup = $_POST['xmlImprimer'];
$string = "<<<XML <?xml version='1.0'?>";
$string .= $recup;
$string .= "XML";

$xml = simplexml_load_string('$string');

var_dump($xml);
Il y a deux erreurs flagrantes dans ce bout de code.

La première sur l'emploi de la syntaxe Heredoc;
La seconde dans la manière d'écrire le paramètre dans une fonction.

Corrigé donc, ça pourra toujours servir :
$recup = $_POST['xmlImprimer'];
$string = <<<XML 
<?xml version='1.0'?>
$recup;
XML;

$xml = simplexml_load_string($string);

var_dump($xml);
On ne découpe pas une chaine Heredoc en concaténant : on ouvre avec <<<LA-CLE et ensuite on met sur la dernière ligne la fermeture avec LA_CLE; et entre les deux le contenu; Et on encadre pas avec des guillemets non plus.

Ensuite dans l'appel de fonction, si le paramètre est une variable PHP, on ne l'encadre pas de guillemets et encore moins d'apostrophes : dans ce dernier cas, la variable ne serait pas interprétés du tout.