parseur xml : contenu du tag coupé à chaque &

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

parseur xml : contenu du tag coupé à chaque &

Message le Mer Juin 04, 2008 13:46

Bonjour,

J'ai un petit soucis lorsque je parse mon xml à chaque apparition de &.
Dès que le parseur rencontre la symbole & dans un tag , il s'arrête et passe au tag suivant

Par exemple ici j'affiche la valeur de title et link avec la profondeur correspondante. Tout se passe bien s'il n'y a pas de "&" dans le xml. Par contre dès qu'il y en a un , voila ce que j'obtiens.
J'ai le fichier test.xml suivant dans lequel j'ai mis amp; dans le titre 4-2 :
Code: Tout sélectionner
<?xml version="1.0"?>
<rss version="2.0">
  <channel>
   <item>
      <title>niveau4-1</title>
      <link>Url-niveau4-1</link>
   </item>
    <item>
      <title>niveau4-2 &amp; essai </title>
      <link>Url-niveau4-2</link>      
      <item>
         <title>niveau5-1</title>
         <link>Url-niveau5-1</link>      
         <item>
            <title>niveau6-1</title>
            <link>Url-niveau6-1</link>
         </item>            
      </item>         
      <group>
         <title>niveau5-2</title>
         <link>Url-niveau5-2</link>      
         <propri>
            <title>niveau6-2</title>
            <link>Url-niveau6-2</link>
         </propri>            
      </group>         
   </item>           
  </channel>
</rss> 


Et quand je le parse , j'obtiens ceci:

Code: Tout sélectionner
Titre = niveau4-1---- profondeur = 4
Lien = Url-niveau4-1---- profondeur = 4

Titre = niveau4-2 ---- profondeur = 4
Titre = &---- profondeur = 4
Titre = essai ---- profondeur = 4
Lien = Url-niveau4-2---- profondeur = 4

Titre = niveau5-1---- profondeur = 5
Lien = Url-niveau5-1---- profondeur = 5

Titre = niveau6-1---- profondeur = 6
Lien = Url-niveau6-1---- profondeur = 6

Titre = niveau5-2---- profondeur = 5
Lien = Url-niveau5-2---- profondeur = 5

Titre = niveau6-2---- profondeur = 6
Lien = Url-niveau6-2---- profondeur = 6


On voit que le titre est coupé au niveau du &.

je pense qu'il doit y avoir un problème de codage quelque part.
Vous voyez comment m'en sortir . Pourquoi donc le parser fait comme si le & était la balise fermante ?

jcaron
WRInaute accro
WRInaute accro
 
Messages: 1139
Inscription: Ven Fév 13, 2004 20:33

Message le Mer Juin 04, 2008 13:56

Si tu ne nous dis même pas ce que tu utilises pour parser ton XML, et comment, c'est sûr, on risque de t'aider énormément.

Jacques.

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Mer Juin 04, 2008 14:06

Oui désolé voila :?
Code: Tout sélectionner
<?php

$profondeur = array();
$fichier = "essai.xml";

    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
     
      global $profondeur;     
      $profondeur[$parseur]++;

     
      }
   

    function fonctionBaliseFermante($parseur, $nomBalise)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";
        global $profondeur;

      $profondeur[$parseur]--;

     
      }

    
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;

if (($derniereBaliseRencontree=="TITLE")) {echo "Titre = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br>";  }
if (($derniereBaliseRencontree=="LINK")) {echo "Lien = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br><br>";  }
     
    }


    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");
   
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");


    while ( $ligneXML = fgets($fp, 1024))
      {

        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

?>


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Mer Juin 04, 2008 14:16

C'est le fonctionnement "normal" de xml_parser, et je pense que XMLReader en fait autant également. A toi de ne traiter les "data" qu'une fois la balise courante fermée.

SimpleXML quant à lui agrège peut-être de manière "automatique", je ne sais pas.

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Mer Juin 04, 2008 14:33

Bon je vais y réfléchir...
Dernière édition par seabird le Mer Juin 04, 2008 15:11, édité 1 fois.

jcaron
WRInaute accro
WRInaute accro
 
Messages: 1139
Inscription: Ven Fév 13, 2004 20:33

Message le Mer Juin 04, 2008 14:34

Oui, c'est assez normal, la plupart des parsers XML ne garantissent pas qu'un bout de texte (entre deux tags) soit délivré "d'un seul coup". Le cas le plus classique ce sont les entités (&amp; &gt...), mais ça pourrait arriver dans d'autre cas de figure (par exemple si tu fournis le XML par blocs).

Il convient toujours dans le handler de texte d'accumuler ce qui est reçu, et de ne faire le traitement que lorsque la balise est fermée.

Jacques.

[grilled]

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Mer Juin 04, 2008 15:11

Bon pour m'en sortir dans le parser j'ai utilisé str_replace , j'ai fait ça:
Code: Tout sélectionner
  while ( $ligneXML = fgets($fp, 1024))
      {
       $ligneXML=str_replace("&amp;","|",$ligneXML);
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }


Ensuite lorsque j'affiche , je fais l'opération inverse:
Code: Tout sélectionner
if (($derniereBaliseRencontree=="TITLE")) {$texte=str_replace("|","&amp;",$texte);echo "Titre = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br>";  }
if (($derniereBaliseRencontree=="LINK")) {$texte=str_replace("|","&amp;",$texte);echo "Lien = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br><br>";  }


ce n'est pas très élégant , mais bon ça marche. :D


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 :

Consultez la description détaillée des produits ou services de Google suivants : API Google Checkout

  • Calcul du taux de liens profonds
    Cet outil vous permet de calculer le taux de liens profonds vers un site web. Un lien profond est un lien qui ne pointe pas vers la page d'accueil mais au contraire vers une page interne du site. Les sites dont l'essentiel du référencement vient de leurs inscriptions dans des annuaires ont un taux de liens profonds faible ; à l'inverse, les sites de référence ont souvent un taux de liens profonds plus important, signe que leur contenu a suscité de nombreux liens spontanés.


Qui est en ligne

Utilisateurs parcourant ce forum: mipc et 0 invités