Page 1 sur 1

Parseur xml avec sax et php

Posté : 21 déc. 2008, 13:52
par yann123
Bonjour,

je réalise un parseur xml avec sax en php. et je bloque à partir du moment ou il y a des éléments de même nom avec des attributs différents.

voici un exemple pour résumé ce qui me pose problème.

le flux:

Code : Tout sélectionner

<flux> <product> <info> <description state="court">La description courte de mon produit.</description> <description state="long">La description longue de mon produit.</description> </info> </product> </flux>
mon parseur:

Code : Tout sélectionner

<?php class parseur { //Je déclare mes variable. var $item = FALSE ; var $chem = '' ; var $description_court ; var $description_long ; var $nouveau_art = array(); var $resume = array() ; function ouvre($sax, $nom, $attributs) // Balise ouvrante { global $item, $chem, $description_long, $description_court, $nouveau_art ; $this->chem .= '/'.$nom; if ($this->chem=='/flux/product') { $this->description_court = ''; $this->description_long = ''; $this->item = TRUE; } elseif ($this->chem=='/flux/product/info/description') // Je modifie $nom pour différencier description_court et description_long { $nom .= '_' . $attributs["state"]; $nom .= '_' . $attributs["state"]; } } function ferme($sax,$nom) // Balise fermante { global $item, $chem, $description_long, $description_court, $nouveau_art ; if ($this->chem=='/flux/product') { $description_court = utf8_decode($this->description_court); $description_long = utf8_decode($this->description_long); // Je met le contenu dans un tableau pour le réutiliser ensuite. $nouveau_art []= array ('description_court' => $description_long, 'description_longue' => $description_long); } $pos = strrpos($this->chem, '/'); $this->chem = substr($this->chem, 0, $pos); } function texte($sax, $texte) //Fonction texte { if ($this->chem == '/flux/product/info/description') { $this->description_court .= $texte; $this->description_long .= $texte; } } } $parseur = new parseur(); $sax = xml_parser_create(); xml_parser_set_option($sax, XML_OPTION_CASE_FOLDING, FALSE); // laisse le nom des balise en minuscule xml_set_object($sax, $parseur); xml_set_element_handler($sax, 'ouvre', 'ferme'); xml_set_character_data_handler($sax, 'texte'); // J'assigne la fonction texte à tout événement textuel. $fichier = 'flux.xml'; $fp = fopen($fichier, 'r'); while ($xml = fread($fp, 10000)) { xml_parse($sax, $xml, feof($fp)); // On execute l'ensemble } xml_parser_free($sax); // Libére de la mémoire. // Je regarde ce qu'il y a dans mon tableau. echo '$nouveau_art contient:<br />'; echo '<pre>'; print_r($nouveau_art); echo '</pre>'; ?>
J'arrive a modifier le nom de l'élément en l'appelant nomElement_Attribut, mais je n'arrive pas a récupérer séparément le contenu de chaque élément (du même nom) avec un attribut différent.

Dans l'exemple ci-dessus je met le contenu dans un tableau et à la fin je regarde ce qu'il contient.
Actuellement j'obtiens ceci.

Code : Tout sélectionner

$nouveau_art contient: Array ( [0] => Array ( [description_court] => La description courte de mon produit.La description longue de mon produit. [description_longue] => La description courte de mon produit.La description longue de mon produit. ) )
Je récupère les deux élément bout à bout, alors que je voudrais avoir:

Code : Tout sélectionner

$nouveau_art contient: Array ( [0] => Array ( [description_court] => La description courte de mon produit. [description_longue] => La description longue de mon produit. ) )
Si quelqu'un peut m'aider, me donner une piste pour résoudre mon problème, ce serait génial.
Toute info est la bien venu.

Je ne trouve pas grand chose sur le net. si vous avez des adresses sur le sujet, je suis preneur également.

Merci d'avance.

Posté : 11 févr. 2009, 16:52
par anisiszen
Bonjour , si j'ai bien compris ton problème voila je peut te donner la solution ou une piste pour la solution. Bref dans ce cas là tu dois tester sur la valeur de l'attribut 'state' si ='court' ou bien ='long' et cela se fait dans le startElemnt {}
if($name=="description")
{ $test_desc="aaaaa";
foreach ($attrs as $tt=>$tt2)
{

if($tt2=="court")
{$test_desc2="court";}

if($tt2=="long")
{$test_desc2="long";}

}
et voila comme ça tu aura deux variables qui sont $test_desc et $test_desc2 et c'est grace à eux tu peut distinguer dans le endElement la description voulue.
if($test_desc!="")
{
	if($test_desc2=="court")
	{//// la on est sur qu'on aura la description courte}

       if($test_desc2=="long")
	{//// la on est sur qu'on aura la description longue}
}
j'espere que j'ai réussi à te donner le chemin à la solution. Anis [[email protected]]