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>
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>';
?>
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.
)
)
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.
)
)
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.