UTILISATION DE XMLREADER

Petit nouveau ! | 6 Messages

04 juil. 2008, 19:31

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:

Mammouth du PHP | 1668 Messages

04 juil. 2008, 21:01

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"...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Invité
Invité n'ayant pas de compte PHPfrance

04 juil. 2008, 21:51

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:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 juil. 2008, 00:23

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 />";
}

?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 6 Messages

05 juil. 2008, 23:08

Merci pour tes infos, tout est bien plus clair pour moi maintenant et je vais pouvoir parser convenablement mon fichier.