Page 1 sur 1

UTILISATION DE XMLREADER

Posté : 04 juil. 2008, 19:31
par Paulux1
Bonjour,

Je découvre XMLREADER qui semble très efficace pour parser des flux XML.
En revanche, peu de doc accessibles sur le sujet...

Mon souci est le suivant.

Je reçois un flux XML du type :

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1" ?> <Disponibilite> <element_disponible> <elements_tarifaire> <prix>470.22</prix> <prix_ttc>471.22</prix_ttc> <prix_hors_taxe>184</prix_hors_taxe> <code_monetaire>EUR</code_monetaire> <marchand>W4752</marchand> </elements_tarifaire> <detail_produit> ........... </detail_produit> <element_disponible> <element_disponible> ........... <element_disponible> <Disponibilite>

De cet extrait, je ne veux récupérer que le contenu de "marchand". J'utilise donc le code suivant pour parser:

Code : Tout sélectionner

$reader = new XMLReader(); $reader->open("exemple.xml"); while( $reader->read() ) { switch ($reader->nodeType) { case (XMLREADER::ELEMENT): switch( $reader->localName ) { case "elements_tarifaire" : $reader->read(); $reader->next(); $reader->next(); $reader->next(); $reader->next(); $reader->next(); $reader->next(); $reader->next(); $reader->next(); $reader->next(); $reader->read(); echo 'Valeur = ' . $reader->value . "<br>"; break; } } }

Pas très élégant le $reader->next(); !!

N'y a t il pas un moyen plus académique de se positionner directement sur marchand ?

Je voulais utiliser $reader->moveToElement("marchand"); mais soit je ne l'utilise pas comme il faut ou ceci n'est pas adapter mais ça ne fonctionne pas.
Quelqu'un aurait un tuyau?
Merci, :wink:

Posté : 04 juil. 2008, 21:01
par katagoto
Arrête ton manège :lol:

Voilà, j'ai fait ma blaque, je suis content ^^

Bref pour revenir à ton problème, pourquoi tu ne fais pas next tant que ce n'est pas la noeud "marchand"...

Posté : 04 juil. 2008, 21:51
par Invité
Bonjour,

Merci pour ton message. J'ai bien sûr fait une boucle en attendant de trouver mieux...mais je voulais juste savoir s'il y avait une fonction permettant d'accéder directement...
XMLREADER à l'air bien fait alors....quitte a apprendre .... :wink:

Posté : 05 juil. 2008, 00:23
par sadeq
Il suffit de boucler, chercher le "localName" nommé "marchand" et si trouvé lire son contenu.
<?php
//ouvrir xml
$reader = new XMLReader();
$reader->open("data3.xml");
//Parcourir xml
while($reader->read()){
	//Chercher l'élément nommé 'marchand'
	if ($reader->nodeType == XMLREADER::ELEMENT && $reader->localName == "marchand") {
		//Lire son contenu texte 
		if ($reader->read()) {
			//afficher la valeur de l'élément
			echo "Valeur = " . $reader->value . "<br />";
		}
	}
}
?>
Voici le xml que j'ai testé :

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1" ?> <disponibilite> <element_disponible> <elements_tarifaire> <prix>470.22</prix> <prix_ttc>471.22</prix_ttc> <prix_hors_taxe>184</prix_hors_taxe> <code_monetaire>EUR</code_monetaire> <marchand>W4752</marchand> </elements_tarifaire> <detail_produit> </detail_produit> </element_disponible> <element_disponible> <elements_tarifaire> <prix>100.00</prix> <prix_ttc>1000.00</prix_ttc> <prix_hors_taxe>100.00</prix_hors_taxe> <code_monetaire>EUR</code_monetaire> <marchand>K100</marchand> </elements_tarifaire> </element_disponible> </disponibilite>
Et voici une deuxième solution utilisant SimpleXML et non la classe xmlReader. L'avantage avec SimpleXML est qu'on peut effectuer des requêtes de recherche XPath (chemin d'accès aux noeuds XML)
<?php
//Solution n°2 : SimpleXML et la recherche XPath
//Ouvrir xml
$xml = simplexml_load_file("data3.xml");

//Chercher les éléments nommés <marchand> qui se trouvent dans les chemins nommés : <disponibilite><element_disponible><elements_tarifaire>
$elements = $xml->xpath('/disponibilite/element_disponible/elements_tarifaire/marchand');

foreach($elements as $noeud) {
	//afficher la valeur de l'élément
	echo "Valeur = " . $noeud . "<br />";
}

?>

Posté : 05 juil. 2008, 23:08
par Paulux1
Merci pour tes infos, tout est bien plus clair pour moi maintenant et je vais pouvoir parser convenablement mon fichier.