XML naviguer en profondeur ??
9 messages
• Page 1 sur 1
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
XML naviguer en profondeur ??
Bonjour,
J'ai à ma disposition un flux de cette structure.
J'ai des problèmes pour lire les éléments en profondeurs. En effet comment distinguer les item category qui ont des profondeurs différentes ??
En général je lit mes fichiers xml avec cette fonction sans problème, mais j'ai toujours eu des fichiers sans profondeur.
J'utilise aussi ce code, mais la aussi je bloque pour naviguer en profondeur:
Comment faites-vous en général ??
Merci
J'ai à ma disposition un flux de cette structure.
- Code: Tout sélectionner
<Categories>
<Country>FR</Country>
<Language>FrFr</Language>
<Category>
<Name>NOM1</Name>
<ID>1</ID>
<Url>URL1</Url>
<Category>
<Name>NOM2</Name>
<ID>5</ID>
<Url>URL2</Url>
<ProductCategory>
<Name>NOM3</Name>
<ID>6</ID>
<Url>URL3</Url>
</ProductCategory>
<ProductCategory>
<Name>NOM4</Name>
<ID>9</ID>
<Url>URL4</Url>
</ProductCategory>
</Category>
</Category>
</Categories>
J'ai des problèmes pour lire les éléments en profondeurs. En effet comment distinguer les item category qui ont des profondeurs différentes ??
En général je lit mes fichiers xml avec cette fonction sans problème, mais j'ai toujours eu des fichiers sans profondeur.
- Code: Tout sélectionner
function lit_xml1($fichier,$item,$champs) {
if($chaine = @implode("",@file($fichier))) {
$tmp = preg_split("/<\/?".$item.">/",$chaine);
$nombre = sizeof($tmp);
for($i=1;$i<$nombre -1;$i+=2)
foreach($champs as $champ) {
$tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
$tmp3[$i-1][] = @$tmp2[1];
}
return $tmp3;
}
}
J'utilise aussi ce code, mais la aussi je bloque pour naviguer en profondeur:
- Code: Tout sélectionner
<?php
$fichier = "fichier.xml";
// Ma propre fonction de traitement des balises ouvrantes
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
// En fait... nous nous conteterons de mémoriser le nom de la balise
// afin d'en tenir compte dans la fonction "fonctionTexte"
global $derniereBaliseRencontree;
$derniereBaliseRencontree = $nomBalise;
}
// Ma propre fonction de traitement des balises fermantes
function fonctionBaliseFermante($parseur, $nomBalise)
{
// On oublie la dernière balise rencontrée
global $derniereBaliseRencontree;
$derniereBaliseRencontree = "";
}
// Ma propre fonction de traitement du texte
// qui est appelée par le "parseur"
function fonctionTexte($parseur, $texte)
{
global $derniereBaliseRencontree;
// Selon les cas, nous affichons le texte
// ou nous proposons un lien
// ATTENTION: Par défaut les noms des balises sont
// mises en majuscules
switch ($derniereBaliseRencontree) {
case "TITLE":
echo $texte;
break;
case "LINK":
echo ":<a href=\"$texte\">L'article complet</a><br />";
break;
}
}
// Création du parseur XML
$parseurXML = xml_parser_create();
// Je précise le nom des fonctions à appeler
// lorsque des balises ouvrantes ou fermantes sont rencontrées
xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante"
, "fonctionBaliseFermante");
// Je précise le nom de la fonction à appeler
// lorsque du texte est rencontré
xml_set_character_data_handler($parseurXML, "fonctionTexte");
// Ouverture du fichier
$fp = fopen($fichier, "r");
if (!$fp) die("Impossible d'ouvrir le fichier XML");
// Lecture ligne par ligne
while ( $ligneXML = fgets($fp, 1024)) {
// Analyse de la ligne
// REM: feof($fp) retourne TRUE s'il s'agit de la dernière
// ligne du fichier.
xml_parse($parseurXML, $ligneXML, feof($fp)) or
die("Erreur XML");
}
xml_parser_free($parseurXML);
fclose($fp);
?>
Comment faites-vous en général ??
Merci
Hello,
selon les cas j'utilise SimpleXML (pour des volumes de données assez petit), ou bien xml_parser mais en maintenant "une pile" des tags afin de connaître l'arborescence exacte.
XMLReader serait également possible, l'approche étant sensiblement la même que xml_parser.
selon les cas j'utilise SimpleXML (pour des volumes de données assez petit), ou bien xml_parser mais en maintenant "une pile" des tags afin de connaître l'arborescence exacte.
XMLReader serait également possible, l'approche étant sensiblement la même que xml_parser.
Utilise SimpleXML comme suggéré par Bool, tu peux même faire du xpath via la méthode ->xpath() donc tu pourras faire ce que tu veux (le XML c'est fait pour être manipulé comme un arbre, DOM par exemple, pas un fichier texte!).
Après le Xpath ça dépend de ce que tu veux faire mais c'est relativement simple.
Après le Xpath ça dépend de ce que tu veux faire mais c'est relativement simple.
dans ta fonction "baliseouvrante" tu fais un array_push() sur un tableau commun, et dans ta fonction "balisefermante" tu fais un array_pop().
Hop c'est magique, ton tableau t'indique où tu te trouves dans ton arborescence.
Dans tous les cas, il serait peut être temps de passer à PHP 5...
Hop c'est magique, ton tableau t'indique où tu te trouves dans ton arborescence.
Dans tous les cas, il serait peut être temps de passer à PHP 5...
Bool a écrit:dans ta fonction "baliseouvrante" tu fais un array_push() sur un tableau commun, et dans ta fonction "balisefermante" tu fais un array_pop().
Hop c'est magique, ton tableau t'indique où tu te trouves dans ton arborescence.
Dans tous les cas, il serait peut être temps de passer à PHP 5...
Merci pour ta suggestion , mais j'ai du mal à saisir la subtilité
je ne vois pas trop ...
bah essayes dans ce cas...
au pire tu peux jouer sur une méthode moins "propre" avec un compteur que tu incrémentes en cas d'ouverture de balise et que tu décrémentes en cas de fermeture. Ainsi il t'indiquera en permanence la "profondeur" actuelle.
au pire tu peux jouer sur une méthode moins "propre" avec un compteur que tu incrémentes en cas d'ouverture de balise et que tu décrémentes en cas de fermeture. Ainsi il t'indiquera en permanence la "profondeur" actuelle.
Bon je pense avoir trouvé , ce n'est peut être pas tres élégant, mais ça marche. Merci de ta suggestion Bool
.
J'ai fait par exemple un test sur ce fichier xml:
J'utilise donc ce code et j'affiche par exemple les données de profondeur 5 .
Maintenant je me demande s'il n'y a pas moyen d'optimiser un peu.
Vous avez des suggestions ?
J'ai fait par exemple un test sur ce fichier xml:
- Code: Tout sélectionner
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<item>
<title>niveau4</title>
<link>niveau4</link>
</item>
<item>
<title>niveau4</title>
<link>niveau4</link>
<item>
<title>niveau5</title>
<link>niveau5</link>
<item>
<title>niveau6</title>
<link>niveau6</link>
</item>
</item>
</item>
</channel>
</rss>
J'utilise donc ce code et j'affiche par exemple les données de profondeur 5 .
Maintenant je me demande s'il n'y a pas moyen d'optimiser un peu.
- Code: Tout sélectionner
<?php
$profondeur = array();
$fichier = "http://domaine.com/fluxrss.rss";
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
global $derniereBaliseRencontree;
$derniereBaliseRencontree = $nomBalise;
global $profondeur;
$profondeur[$parseur]++;
// print "Début de l'élément : ".$nomBalise."\n -- ";
//print "profondeur : ".$profondeur[$parseur]." "; echo"<br>";
}
// Ma propre fonction de traitement des balises fermantes
function fonctionBaliseFermante($parseur, $nomBalise)
{
// On oublie la dernière balise rencontrée
global $derniereBaliseRencontree;
$derniereBaliseRencontree = "";
global $profondeur;
//print "Fin de l'élément : ".$nomBalise." ";
//print "profondeur : ".$profondeur[$parseur]." ";
$profondeur[$parseur]--;
//echo"<br>"; echo"<br>";
}
function fonctionTexte($parseur, $texte)
{
global $derniereBaliseRencontree;
global $profondeur;
if (($derniereBaliseRencontree=="TITLE")&& $profondeur[$parseur]==5) {echo "<b>$texte</b>";echo"<br>"; }
if (($derniereBaliseRencontree=="LINK")&& $profondeur[$parseur]==5) echo "<a href=\"$texte\"><b>Lien</b></a><br />";
}
// Création du parseur XML
$parseurXML = xml_parser_create();
xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");
xml_set_character_data_handler($parseurXML, "fonctionTexte");
// Ouverture du fichier
$fp = fopen($fichier, "r");
if (!$fp) die("Impossible d'ouvrir le fichier XML");
// Lecture ligne par ligne
while ( $ligneXML = fgets($fp, 1024))
{
xml_parse($parseurXML, $ligneXML, feof($fp)) or
die("Erreur XML");
}
xml_parser_free($parseurXML);
fclose($fp);
?>
Vous avez des suggestions ?
Salut,
Je viens de trouver une autre méthode pour parser le flux et connaitre la profondeur.
Ici j'affiche les balises "title" et "link" de profondeur 4.
Par contre, je pense qu'il y a plus judicieux pour enregistrer le tableau des balises de leur profondeur et de leur contenu. ( il y a des positions vides , vu la manière d'enregistrer que j'utilise. )
Quelqu'un à une idée ?
Je viens de trouver une autre méthode pour parser le flux et connaitre la profondeur.
Ici j'affiche les balises "title" et "link" de profondeur 4.
Par contre, je pense qu'il y a plus judicieux pour enregistrer le tableau des balises de leur profondeur et de leur contenu. ( il y a des positions vides , vu la manière d'enregistrer que j'utilise. )
Quelqu'un à une idée ?
- Code: Tout sélectionner
<?php
$xml_doc = "test.xml";
//on ouvre le fichier xml en lecture
$handle = fopen ($xml_doc, "r");
//on lit les données jusqu'à la fin du fichier et on les stocke dans un chaîne
$data_to_parse = fread ($handle, filesize ($xml_doc));
//on ferme le fichier xml
fclose ($handle);
//on crée un parseur XML
$xml_parser = xml_parser_create();
//on lui indique de ne pas transformer les balises en majuscule
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING,0);
//on démarre l'analyse du XML et on stocke les données dans des tableaux
xml_parse_into_struct($xml_parser, $data_to_parse, $tableau_valeurs, $tableau_index);
//on détruit le parseur
xml_parser_free($xml_parser);
for ($i=0; $i < count($tableau_valeurs); $i++)
{
//on fait un tableau des balises de leur profondeur et de leur contenu
$info[$tableau_valeurs[$i]["tag"]][$tableau_valeurs[$i]["level"]][$i] = $tableau_valeurs[$i]["value"];
}
for ($i=0; $i < count($tableau_valeurs); $i++)
{
if($info['title']['4'][$i]!="") { echo $info['title']['4'][$i];echo"<br>";}
if($info['link']['4'][$i]!="") { echo $info['link']['4'][$i];echo"<br><br>";}
}
?>
9 messages
• Page 1 sur 1
Formation recommandée sur ce thème :
Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Naviguer et l'annonceur paie ! (2007-04-23)
- Naviguer sans cliquer ? possible ... (2005-04-29)
- naviguer comme google (2004-04-19)
- Naviguer comme un robot de moteur de recherche (2009-07-24)
- Comment faire pour naviguer sur Google.com ? (2007-08-03)
- [résolu] - php - Naviguer d'une semaine à l'autre - Agenda (2006-10-24)
- [XML et XSLT] Tester si une chaîne est un chemin XML valide (2008-01-16)
- [Résolu] [PHP - XML] Comment transformer XML en tableau (2005-04-25)
- Google ne va plus en profondeur !! (2005-12-03)
- PR et profondeur (2005-01-20)
- Précisez vos recherches sur Google par la profondeur en répertoires
- Google Enterprise a son blog
- Nouvelles fonctionnalités à l'essai pour la Google Toolbar
- Le blog de Google Analytics
- Le blog officiel de Google Research
- Un (RSS) pour tous (les blogs officiels de Google)
- Le blog officiel de Google au Japon
- Le blog officiel de Google Custom Search (CSE)
- Le blog officiel de Google AdWords en français - Inside AdWords FR
- Annuaire WRI : intégration des flux XML des inscrits
Consultez la description détaillée des produits ou services de Google suivants : API Google Checkout
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


