[XML] [EXPAT] xml_parse et la gestion des événements...
Bonjour à tous.
Je cherche à utiliser le parseur XML de PHP sur un design pattern Monteur.
Grosso modo, la classe Directeur est chargée de lire le fichier XML, le parse et envoie les infos ad hoc au Monteur, qui les traite à sa sauce.
Structure du code pour le Directeur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
class ListeDiffDirecteur
{
var $resource; // le texte xml à parser se retrouve ici...
var $monteur;
[...]
function getMonteur()
{ return $this->monteur; }
function setMonteur( $monteur )
{ $this->monteur = $monteur; }
}
class ListeDiffDirecteur_xml extends ListeDiffDirecteur
{
function build()
{
// Préparation de l'analyseur XML
$parser = xml_parser_create( $this->encoding );
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
xml_set_character_data_handler( $parser, array( $this, "innerData" ) );
xml_parse( $parser, $this->resource, true );
xml_parser_free( $parser );
return true;
}
function innerData( $parser, $data )
{
$this->monteur->testData( $data );
echo $this->monteur->getTexte()."<br>"; // on vérifie le contenu du monteur à chaque étape...
return true;
}
} |
Structure du code pour le Monteur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class ListeDiffMonteur
{
var $texte;
function ListeDiffMonteur()
{ $this->texte = ""; }
function getTexte()
{ return $this->texte; }
}
class ListeDiffMonteur_html extends ListeDiffMonteur
{
function testData( $data )
{ $this->texte .= "$data\n"; }
} |
Le code de test :
Code:
1 2 3 4 5 6 7 8 9
|
// 1 - on analyse
$dir = new ListeDiffDirecteur_xml();
$dir->setMonteur( new ListeDiffMonteur_html() );
$dir->build();
// 2 - on affiche le résultat
$mt = $dir->getMonteur();
$txt = $mt->getTexte();
echo "[texte]<br>==>>$txt<<==<br>[/texte]<br>"; |
Structure de l'affichage en sortie
Code:
1 2 3 4 5 6 7 8 9
|
bla
blabla
blablabla
...
// etc... on voit donc que le $texte du monteur stocke bien les contenus textuels envoyés par xml_parse et le gestionnaire d'événement
// mais en fin de traitement, on affiche :
[texte]==><==[/texte]
// le texte du monteur est vide à présent... |
Question : qu'est-ce qui provoque la disparition du texte ?