SPL & RecursiveIteratorIterator : Afficher les infos (XML)

JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 - 24 févr. 2009 à 01:38
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 - 28 févr. 2009 à 01:26
Bonsoir à tous ^^
Voila déjà un petit moment que je n'étais pas venu.

Si ce soir (ou plutôt, ce matin) je suis ici, c'est pour une question qui me turlupine depuis déjà quelques temps : la SPL.

Je
dispose de données récursives (par exemple XML), et je voudrais
afficher ces infos me manière récursive, en respectant bien
d'imbrication des blocs (Vous me suivez ?)
Arf, je n'arrive plus à m'exprimer de si bonne heure ...
Un bon dessin vaut mieux qu'un long discours ...

Données :

$xml =<<<EOF
<doc>
 
    <text>Text</text>
    <h2 title="Titre 1.2">
      <text>Texte (1.2)</text>
   

  </h1>
</doc>
EOF;, Return :

 

    <text>Text</text>

    <h2 title="Titre 1.2">

      <text>Texte (1.2)</text>

   

  </h1>

(qui sera converti en code XHtml)

Pour faire simple, je voudrais afficher les infos XML en conservant le format.

Bref, pas de changement quoi ^^ Enfin, si ... car
j'essaye désespérément d'utiliser la SPL (dont il manque de sérieuses
explications ... dur dur de trouver des infos dessus (exemples concrets)

Mon
idée, était d'utiliser RecursiveIteratorIterator, mais je n'obtient pas
ce que je veux (même en jouant sur SELF_FIRST, CHILD_FIRST,
LEAVES_ONLY, ...)


Je n'arrive pas à avoir :
open <h1>

  open <text>

    open <h2>


  close </text>

close </text>


(j'y arrive en jouant sur les [begin/end]Children(), mais je n'ai que les 1er nodes (formatés) : logique).

Cela doit être une mauvaise utilisation ... Ou une méconnaissance sur les fonctions disponibles

J'y arrive sans la SPL, mais je me demandais s'il n'était pas possible d'utiliser la puissance de cette dernière ...


Sinon, avez vous des exemples concrets, ou un exemple à me proposer ?

Merci :p
<hr />Si ma reponse te convient, merci de l'accepter ! 

4 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 févr. 2009 à 19:46
Hello Jojo :-)

tu vois, j'accours...;-)
Bon heu là, sincèrement, je rentre du taf et je n'ai pas la tête à ça...mais ta question est intéressante.
Est-ce que c'est possible via la SPL ? Oui, très certainement! Comment? Le problème de la SPL c'est que c'est compliqué à utiliser, en tous cas pour des utilisations poussées. Et quand il y a de la récursivité, c'est pire encore...ça demande toujours pas mal de réflexion et d'essais.
Donc...laisse moi un peu de temps ce week-end, je tâcherai de me pencher sur ton problème.
Je ne serai pas dispo toute la semaine prochaine (déplacement pro au Maroc) donc si ce we je n'ai pas le temps, faudra que t'attendes mon retour.
Mais de ce que j'en lis, tu pars bien...en tous cas, je serais parti sur la même voie :-)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 févr. 2009 à 19:48
Je tiens quand même à ajouter que vu ce que tu veux faire (je viens de remarquer que tu transformais ton doc en xhtml), ni la SPL, ni un "parser" PHP ne sont les outils les plus adaptés et les plus puissants...faut regarder du côté de XSL, là...et crois-moi, ce serait TRES simple...
Mais avec la SPL, ça devrait être rigolo et c'est un exercice intéressant, je vais donc regarder.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 févr. 2009 à 20:19
Bon allez, j'ai quand même pas résisté à l'envie de jeter un oeil rapide...je te donne une voie :
<?php
$xml =<<<EOF
<?xml version='1.0' encoding="UTF-8"?>
<doc>
 
    <text>Text</text>
    <h2 title="Titre 1.2">
      <text>Texte (1.2)</text>
   

  </h1>
</doc>
EOF;

$it = new RecursiveIteratorIterator(new SimpleXMLIterator($xml));
$it->rewind();
while($it->valid()) {
    print_r($it->getInnerIterator());
    $it->next();
}
?>

Si tu t'en sors pas, je t'aide un peu plus ce we :-)
0
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
28 févr. 2009 à 01:26
Lu,

Merci pour le coup de main ;)

Je sais, mais j'aimerais vraiment utiliser la SPL (c'est ma petite folie du moment).
En fait, j'utilise ce code pour afficher du GEDCOM (format pour fichier généalogique et un autre projet), et il n'y aura pas forcement une sortie XHtml ... ^^

En fait, ce que tu me propose, c'est le code que j'utilisais .. le seule problème, c'est pour "refermer les balises"

Avec ton code, (et le XML quasi similaire), j'obtiens :
# OPEN [text]
Text
# OPEN [text]
Texte 1 a (1.1 a)
Texte 1 b (1.1 b)
# CLOSE
Text
# OPEN [text]
Texte 2 a (1.2 a)
Texte 2 b (1.2 b)
# CLOSE

# CLOSE

Alors que moi je voudrais avoir :

# OPEN [H1]
  # OPEN text  // j'ai
  Text
  # CLOSE Text
<gras># CLOSE [H1]
...

Ou tout du moins, quelque chose dans ce genre ...

Après moults essais, j'arrive à quelque chose (en jouant principalement sur la fonction current()) .. mais bon, ça ne me plait pas trop ... (Le pire c'est que j'ai déjà trouvé la solution quelque part ...)

Voici mon <strike>brouillon</strike> code:

Class _R extends RecursiveIteratorIterator
{
    public $hLevel  = array();
   
    function BeginChildren()
    {
        echo '
';
        echo "\n";
    }
   
    function current()
    {
        $c = parent::current();
       
        switch ($this -> key())
        {
            case 'h' :
                $n = $this -> getDepth();
                if( isset($this -> hLevel[$n]) )
                {
                    $this -> hLevel[$n]++;
                    $divtitleavt = "\n" . '
';
                    $divtitle = "\n" . '
';
                    //echo ' H++ ';
                }
                else
                {
                    $this -> hLevel[$n] = 1;
                    $divtitleavt = '';
                    $divtitle = "\n" . '
';
                    //echo ' H "', $n, '" CREATED ';
                }
               
                $depth = count($this -> hLevel);
                $depth = $depth > 7 ? 6 : $depth;
               
                return $divtitleavt . "\n" . '<h' . $depth . ' class="title">' . implode('.', $this -> hLevel) . ' - ' . trim($c['title']) . '</h' . $depth . '>' . $divtitle;
                break;
            case 'demo' :
                return "\n" . '
Démonstration :
' . trim($c) . '
';
                break;
            case 'expl' :
                return "\n" . '
Exemple :
' . trim($c) . '
';
                break;
            case 'text' :
                return "\n" . '{T:' . trim($c) . '}

';
                break;
        }
        return parent::current();
    }
   
   
    function EndChildren()
    {
        echo '
';
        echo "\n";
        if( isset($this -> hLevel[$this -> getDepth()]) )
        {
            unset($this -> hLevel[$this -> getDepth()]);
            echo '
';
        }
    }
}

$it = new _R(new SimpleXMLIterator($xml), _R::SELF_FIRST);
foreach( $it as $key => $val )
{
    echo $val;
}
Arf, je sens que je vais retrouner aux bonnes vielles fonctions récursives ^^

Merci de l'aide ^^ Et tu as ton temps, de toute façon je dois bosser aussi ... je risque de pas trop être présent :p
B'soir
<hr />Si ma reponse te convient, merci de l'accepter ! 
0
Rejoignez-nous