La Communauté Webmaster  forum rss


  Forum-webmaster
  Technique - programmation
  PHP / MySQL
(Modérateurs: Shain, Jey, erwinol, Lilian, lauryv, ToToMaStEr)
  Parsage XML, le bug vient du PHP, du XML, ou des deux ?
« Précédent Suivant »
Pages: [1] Descendre
Répondre    Aviser des réponses    Envoyer le sujet    Imprimer
  Auteur  Sujet: Parsage XML, le bug vient du PHP, du XML, ou des deux ?  (Lu 1247 fois)
Parsage XML, le bug vient du PHP, du XML, ou des deux ?
« sur: le 11-06-2008 a 19:50:19 »
Poulpette
Invité

E-Mail
Répondre avec citation

Bonjour,

J'ai un petit (en fait, un gros pour l'instant) souci avec mon système de parsage XML.
J'ai globalement suivi un tutoriel disponible sur un autre site (j'y ai également exposé mon problème, sans obtenir de réponse(s) pour l'instant), et bon ben... ça ne fonctionne pas.

Voici le topo :
J'ai un site avec une page (presentation.php), cette dernière est éditable via l'administration.
J'ai donc une page rediger_presentation.php ainsi qu'une page afficher_presentation.php (pour voir ce que contient actuellement la page).
Tout fonctionne : je rédige une page (avec uniquement du texte), elle se stocke bien dans la base de données, s'affiche dans afficher_presentation.php ainsi que dans la page concernée, presentation.php.

J'ai cependant voulu y ajouter un système  de mise en forme, et j'ai voulu passer par le XML.
L'ennui, c'est que lorsque je rédige du texte avec des balises, la page presentation.php me renvoie l'erreur XML suivante :
Code:
Erreur d'analyse XML : aucun élément trouvé
Emplacement : http://127.0.0.1/monsite/presentation.php
Numéro de ligne 90, Colonne 1 :
^

Voici ce que contient rediger_presentation.php :
Code:
   session_start();   
   if (isset($_SESSION['connect'])) // Si la variable existe
   {
      $connect = $_SESSION['connect']; // On recupere la valeur de la variable
   }
   
   else // Si la variable n'existe pas, on lui donne la valeur zero
   {
      $connect = 0;
   }
   
   if ($connect == "1") // Si le visiteur est connecte
   {
      include ("includes/declarations.php");
      
      $titre = "Rédiger ou modifier la page « Présentation »";
      
      declarations($titre);
      
      en_tete_admin();
?>
   <div id="ariane">
      <p><strong>Vous &#234;tes ici&#160;:&#160; <a href="index.php">Accueil</a>&#160;&#62;&#160;Rédigier/Modifier la page « Pr&#233;sentation »</strong></p>
   </div>
<?php
   menu();
?>
   <div id="texte">
      <h2>Rédiger/Modifier une <em>news</em></h2>
      
      <?php
         connexion(); // On se connecte a la BDD
         // On regarde s'il s'agit d'une modification
         if (isset($HTTP_GET_VARS['modifier_presentation']))
         {
            // On protege la variable "modifier_news" pour prevenir toute faille S.Q.L possible
            $HTTP_GET_VARS['modifier_presentation'] = mysql_real_escape_string(htmlspecialchars($HTTP_GET_VARS['modifier_presentation']));
            // On recupere ensuite les informations de la nouvelle correspondante
            $retour = mysql_query('SELECT * FROM presentation WHERE id=\''.$HTTP_GET_VARS['modifier_presentation'].'\'') or die(mysql_error());
         
            $donnees = mysql_fetch_array($retour);
         
            // On place le contenu de la page dans des variables
            $contenu = stripslashes($donnees['contenu']);
            $id = $donnees['id']; // Grace a cette variable, on sait que c'est une modification
         }
      
         else // Sinon c'est qu'on redige une nouvelle actualite
         {
            // On initialise les variables
            $contenu = '';
            $id = 0; // Puisqu'elle vaut zero, c'est que ce n'est pas une modification
         }
      ?>
   
      <!-- A present on cree le formulaire -->
      <form action="afficher_presentation.php" method="post">
         <p>
            <label for="contenu"><strong>Contenu:</strong>&#160;</label><br />
            <textarea name="contenu" cols="50" rows="10"><?php echo $contenu; ?></textarea><br />
         
            <input type="hidden" name="id" value="<?php echo $id; ?>" />
            <input type="submit" value="Envoyer" />
         </p>
      </form>
   </div>
<?php
   } // Fin du If
   
   else // Sinon c'est que les identifiants ne sont pas bons, on affiche donc un avertissement
   {
      include("includes/declarations.php");
   
      $titre = "R&#233;diger ou modifier la page « Pr&#233;sentation »";
   
      declarations($titre);
?>
      <div id="texte">
         <h2>Accès refusé</h2>
         <p>
            Veuillez vous identifier pour pouvoir accéder à l'espace d'administration.
         </p>
         
         <form method="post" action="index.php">
            <p>
               <input type="submit" value="OK" />
            </p>
         </form>
      </div>
<?php
   } // Fin du Else
   footer(); // On appelle le pied de page
?>


Voici à présent ce que contient la page qui contient la fonction de parsage (parsage.php) :
Code:
   function parsage($document)
   {
      $document = '<?xml version="1.0" encoding="ISO-8859-1"?><zikcode>'.$document.'</zikcode>';
      $documentXml = new DomDocument;
      $documentXml->loadXML($document);
      $elements = $documentXml->getElementsByTagName('zikcode');
      $resultatHtml = '';
      $arbre = $elements->item(0);
      
      $resultatHtml = parsageEnfant($arbre);
      
      return utf8_decode($resultatHtml);
   }
   
   function parsageEnfant($noeud) // parsage des enfants
   {
      if(!isset($accumulation)) // S'il s'agit de la premiere balise, on initialise la variable accumulation
      {
         $accumulation = '';
      }
      
      $enfantsNiveau1 = $noeud->childNodes; // Les enfants du noeud traite
      
      foreach ($enfantsNiveau1 as $enfant) // On verifie pour chaque enfant...
      {
         if ($enfant->hasChildNodes() == true) //... S'il a lui-meme des enfants
         {
            $accumulation .= parsageEnfant($enfant); // Si oui, on revient au parsage enfant
         }
         
         else //... S'il n'en a plus
         {
            $accumulation .= parsageNormal($enfant); // On parse normalement
         }
      }
      return parsage_normal($noeud, $accumulation);
   }
   
   function parsageNormal($noeud, $contenuAInserer = '')
   {
      $balise1 = array('gras' => '<strong>',
                  'italique' => '<em>',
                  'couleur' => '<span class="$1">',
                  'liste' => '<ul>',
                  'puce' => '<li>',
                  'lien' => '<a href="$1">',
                  'abr' => '<abbr title="$1">',
                  'image' => '<img src="$1" alt="$2" />',
                  '#text' => ''); // Tableau des balises ouvrantes
            
      $balise2 = array('gras' => '</strong>',
                  'italique' => '</em>',
                  'couleur' => '</span>',
                  'liste' => '</ul>',
                  'puce' => '</li>',
                  'lien' => '</a>',
                  'abr' => '</abbr>',
                  'image' => '',
                  '#text' => ''); // Tableau des balises fermantes
            
      $attributs = array('couleur' => 'nom',
                  'lien' => 'url',
                  'image' => 'legende'); // Tableau des attributs
      
      $nom = $noeud->nodeName; // On recupere le nom du noeud
      
      if (!empty($contenuAInserer)) // On regarde si on veut specifier du cotenu pre-parse
      {
         $contenu = $contenuAInserer; // Si oui, on met la variable de fonction en contenu
      }
      
      else // Sinon, le contenu du noeud
      {
         $contenu = $noeud->nodeValue;
      }
      
      $premiereBalise = $balise1[$nom]; // Balise ouvrante
      
      if($noeud->hasAttributes() and $nom != 'image') // On remplace les attributs (sauf pour les images)
      {
         $un = $noeud->attributes->getNamedItem($attributs[$nom])->nodeValue; // On recupere la valeur de l'attribut
         $premiereBalise = str_replace("$1", $un, $premiereBalise); // On remplace la valeur $1 par celle de l'attribut
      }
      
      if ($nom == 'image') // Cas des images
      {
         $un = $contenu; // C'est $1 qui recupere le contenu du noeud (url)
         $premiereBalise = str_replace("$1", $un, $premiereBalise);
         
         if ($noeud->hasAttributes()) // Si l'image contient une legende ($2)
         {
            $deux = $noeud->attributes->getNamedItem('legende')->nodeValue; // On recupere l'attribut « legende »
         }
         
         else // Par defaut, la legende est « Image »
         {
            $deux = 'Image';
         }
         
         $premiereBalise = str_replace("$2", $deux, $premiereBalise);
         $intermediaire = $premiereBalise;
      }
      
      else // Cas general
      {
         $intermediaire = $premiereBalise . $contenu . $balise2[$nom]; // On assemble le tout
         if ($nom == 'liste' or $nom == 'puce')
         {
            $intermediaire = preg_replace("#<ul>(\s)*<li>#sU", "<ul><li>", $intermediaire);
            $intermediaire = preg_replace("#</li>(\s)*<li>#sU", "</li><li>", $intermediaire);
            $intermediaire = preg_replace("#<li>(\s)*</ul>#sU", "</li></ul>", $intermediaire);
         }
         
         if ($nom == 'zikcode')
         {
            $intermediaire = nl2br($intermediaire); // On saute des lignes au resultat final
         }
      }
      return $intermediaire; // On renvoie le texte parse
   }
?>

Et voici enfin ce que contient la page presentation.php :
Code:
<?php
   include ("includes/declarations.php");
   
   $titre = "Pr&#233;sentation";
   
   declarations($titre);
   
   en_tete();
?>
   <div id="ariane">
      <p><strong>Vous &#234;tes ici&#160;:&#160;</strong><a href="index.php" title="Accueil">Accueil</a>&#160;&#62;&#160;Pr&#233;sentation</p>
   </div>
<?php
   menu();
?>
   <div id="texte">
      <?php
         connexion();
         
         $retour = mysql_query('SELECT contenu FROM presentation') or die(mysql_error());
         $donnees = mysql_fetch_array($retour);
         $texte = nl2br(stripslashes($donnees['contenu']));
         include("parsage.php");
         
         echo parsage($texte);
      ?>
   </div>
<?php
   footer();
?>

Rapporter au modérateur  

Re:Parsage XML, le bug vient du PHP, du XML, ou des deux ?
« Répondre #1 sur: le 11-06-2008 a 19:52:24 »
Poulpette
Invité

E-Mail
Répondre avec citation

Hop, et comme la longueur des message est apparemment limitée, je continue par ici (pas pratique, ce système de limitation, surtout sur un forum où l'on est amené à poster du code...).

J'ai donc tenté d'enlever la déclaration XML dans parsage.php, car elle est déjà présente dans declarations.php...
Code:
header("Vary: Accept");
   if (stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml") || stristr($_SERVER["HTTP_USER_AGENT"],"W3C_Validator"))
   {
      header("Content-Type: application/xhtml+xml; charset=iso-8859-1");
      echo ('<?xml version="1.0" encoding="iso-8859-1"?>');
   ?>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <?php
   }
   
   else
   {
      header("Content-Type: text/html; charset=iso-8859-1");
   ?>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   <?php
   }
   ?>

... mais rien n'y fait.

Je me demande donc si, bien que l'erreur retournée soit d'ordre XML, le problème ne viendrait pas en fait de mon PHP.
Mais si oui, j'avoue ne pas voir où cela coince...

Si quelqu'un avait une idée, de serait top.

Par avance, merci pour votre aide. :)

Rapporter au modérateur  
Re:Parsage XML, le bug vient du PHP, du XML, ou des deux ?
« Répondre #2 sur: le 18-06-2008 a 08:53:59 »
digacreat
Membre récent
*

Hors-Ligne

Messages: 30



Je suis un lama!

Voir le Profil    E-Mail
Répondre avec citation

pour l'erreur dans xml envoi le code source de la page donné
merci

Rapporter au modérateur  
Répondre    Aviser des réponses    Envoyer le sujet    Imprimer
Pages: [1] Monter
« Précédent Suivant »
Sauter à: 

Votre statut : Invité
Vous devez être membre pour participer.
 
 
Let’s Encrypt : le certificat SSL gratuit
Tester votre site internet sur différents navigateurs
[WordPress] Des problèmes avec l’administration ?
Rappel : Mettez à jour vos CMS et vos sites E-commerce
Le .fr fête ses 25 années d’existence !
Mesurer votre audience en temps réel avec BubbleStat
Porter réclamation contre Google Panda ?
Zlio n’est plus …
 
 
 
 
 

Copyright (c) Devclic 2002 - 2026 - Tous droits réservés

creation site internet strasbourg