Rechercher : dans
Par :

Parseur xml avec sax en php

Dernière réponse le 30 avr 2009 à 19:46:24 yann123, le 21 déc 2008 à 12:28:22 
 Signaler ce message aux modérateurs

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:

<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:

<?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.
$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.
        )

)



Alors que je voudrais avoir:
$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.
Configuration: Windows XP
Firefox 3.0.5

Meilleures réponses pour « parseur xml avec sax en php » dans :
[PHP] Parse error, unexpected T_STRING, expecting ',' or ';' VoirCette erreur, fréquente, se produit notamment lorsqu'un guillemet est présent dans une chaîne délimitée par ce même type de guillemets, par exemple :
PHP - Parser du XML VoirIntroduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de...
DOM (Document Object Model) et SAX (Simple API for XML) VoirXML permet de définir la structure du document uniquement, ce qui permet d'une part de pouvoir définir séparément la présentation de ce document, d'autre part d'être capable de récupérer les données présentes dans le document pour les...
Introduction à XML VoirPrésentation de XML XML (entendez eXtensible Markup Language et traduisez Langage à balises étendu, ou Langage à balises extensible) est en quelque sorte un langage HTML amélioré permettant de définir de nouvelles balises. Il s'agit effectivement...

1

 rushy, le 30 avr 2009 à 19:46:24

Bonjour,
ET tu es arriv" à quelques choses, c'est un long sujet. . .

Répondre à rushy