parseur xml : contenu du tag coupé à chaque &

WRInaute occasionnel
Bonjour,

J'ai un petit soucis lorsque je parse mon xml à chaque apparition de &.
Dès que le parseur rencontre la symbole & dans un tag , il s'arrête et passe au tag suivant

Par exemple ici j'affiche la valeur de title et link avec la profondeur correspondante. Tout se passe bien s'il n'y a pas de "&" dans le xml. Par contre dès qu'il y en a un , voila ce que j'obtiens.
J'ai le fichier test.xml suivant dans lequel j'ai mis amp; dans le titre 4-2 :
Code:
<?xml version="1.0"?>
<rss version="2.0">
  <channel>
	<item>
		<title>niveau4-1</title>
		<link>Url-niveau4-1</link>
	</item>
    <item>
		<title>niveau4-2 &amp; essai </title>
		<link>Url-niveau4-2</link>		
		<item>
			<title>niveau5-1</title>
			<link>Url-niveau5-1</link>		
			<item>
				<title>niveau6-1</title>
				<link>Url-niveau6-1</link>
			</item>				
		</item>			
		<group>
			<title>niveau5-2</title>
			<link>Url-niveau5-2</link>		
			<propri>
				<title>niveau6-2</title>
				<link>Url-niveau6-2</link>
			</propri>				
		</group>			
	</item>	  		
  </channel>
</rss>

Et quand je le parse , j'obtiens ceci:

Code:
Titre = niveau4-1---- profondeur = 4
Lien = Url-niveau4-1---- profondeur = 4

Titre = niveau4-2 ---- profondeur = 4
Titre = &---- profondeur = 4
Titre = essai ---- profondeur = 4
Lien = Url-niveau4-2---- profondeur = 4

Titre = niveau5-1---- profondeur = 5
Lien = Url-niveau5-1---- profondeur = 5

Titre = niveau6-1---- profondeur = 6
Lien = Url-niveau6-1---- profondeur = 6

Titre = niveau5-2---- profondeur = 5
Lien = Url-niveau5-2---- profondeur = 5

Titre = niveau6-2---- profondeur = 6
Lien = Url-niveau6-2---- profondeur = 6

On voit que le titre est coupé au niveau du &.

je pense qu'il doit y avoir un problème de codage quelque part.
Vous voyez comment m'en sortir . Pourquoi donc le parser fait comme si le & était la balise fermante ?
 
WRInaute accro
Si tu ne nous dis même pas ce que tu utilises pour parser ton XML, et comment, c'est sûr, on risque de t'aider énormément.

Jacques.
 
WRInaute occasionnel
Oui désolé voila :?
Code:
<?php

$profondeur = array();
$fichier = "essai.xml";

    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
      
      global $profondeur;     
      $profondeur[$parseur]++;

      
      }
   

    function fonctionBaliseFermante($parseur, $nomBalise)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";
        global $profondeur;

      $profondeur[$parseur]--;
 
      
      }

	  
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;

if (($derniereBaliseRencontree=="TITLE")) {echo "Titre = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br>";  }
if (($derniereBaliseRencontree=="LINK")) {echo "Lien = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br><br>";  }
     
    }


    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");
   
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");


    while ( $ligneXML = fgets($fp, 1024))
      {

        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

?>
 
WRInaute passionné
C'est le fonctionnement "normal" de xml_parser, et je pense que XMLReader en fait autant également. A toi de ne traiter les "data" qu'une fois la balise courante fermée.

SimpleXML quant à lui agrège peut-être de manière "automatique", je ne sais pas.
 
WRInaute accro
Oui, c'est assez normal, la plupart des parsers XML ne garantissent pas qu'un bout de texte (entre deux tags) soit délivré "d'un seul coup". Le cas le plus classique ce sont les entités (&amp; &gt...), mais ça pourrait arriver dans d'autre cas de figure (par exemple si tu fournis le XML par blocs).

Il convient toujours dans le handler de texte d'accumuler ce qui est reçu, et de ne faire le traitement que lorsque la balise est fermée.

Jacques.

[grilled]
 
WRInaute occasionnel
Bon pour m'en sortir dans le parser j'ai utilisé str_replace , j'ai fait ça:
Code:
  while ( $ligneXML = fgets($fp, 1024))
      {
       $ligneXML=str_replace("&amp;","|",$ligneXML);
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }

Ensuite lorsque j'affiche , je fais l'opération inverse:
Code:
if (($derniereBaliseRencontree=="TITLE")) {$texte=str_replace("|","&amp;",$texte);echo "Titre = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br>";  }
if (($derniereBaliseRencontree=="LINK")) {$texte=str_replace("|","&amp;",$texte);echo "Lien = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br><br>";  }

ce n'est pas très élégant , mais bon ça marche. :D
 
Discussions similaires
Haut