IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] pb avec simplexml_load_file dans sous dossier


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut [SimpleXML] pb avec simplexml_load_file dans sous dossier
    Bonjour,

    Je voudrais faire une fonction récursive pour transformer des fichiers XML contenus dans des dossiers et des sous dossiers.
    J'utilise pour cela simplexml_load_file qui me permet d'exploiter le contenu de ces fichiers d'une manière simple.

    Le soucis est que ça fonctionne sur le repertoire courant , mais pas dans les sous répertoires !?! Si quelqu'un pourrait me dire ce qu'il ne convient pas dans cette fonction.

    Merci d'avacne pour vos réponses !!!

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
    
    function recursive_readdir ($dir) {
    
    if (is_dir ($dir))
    
    $handle = opendir($dir);
    
    else {
    echo $dir, ' n\' est pas u nrepertoire valide';
    exit;
    }
    while(false !== ($file = readdir($handle))) {
        if($file != "." && $file != ".." && $file !="transxml.php") {
    
          $path = $dir.'/'.$file;
    
    if (is_dir ($path)) {
         echo $path, ' est un repertoire valide';
          recursive_readdir ($path);
    }
    else
    
    $sxml = simplexml_load_file($file);
    $titre = utf8_decode($sxml->Proprietes->Sujet);
    $texte = utf8_decode($sxml->Contenu);
    
    $texte = str_replace('?',"'",$texte);
    $texte = str_replace('\(','',$texte);
    $bad = array ('\cST\s','\cTI\s','\cTX\s','\cSG\s','\$','\dSG\t','\dDS1,2\t','\dFS\t','\dSN\t','\dSI\t','\cCH\s');
    $good = array ('','','',' ',' ','','','','','','');
    $texte = str_replace ($bad,$good,$texte);
    
    $titre = str_replace (' ','_',$titre);
    
    $fp = fopen ($titre.'.txt','w');
    fputs ($fp,$texte);
    fclose ($fp);
    
    }
    
    }
    closedir ($handle);
    }
    recursive_readdir ('.');
    ?>

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    • "Ne fonctionne pas" : à définir, erreurs ?, comportement obtenu et attendu
    • Votre code manque de lisibilité
    • Ne manque-t-il pas les accolades au bloc du (second) else ?

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    * "Ne fonctionne pas" : à définir, erreurs ?, comportement obtenu et attendu

    La fonction doit créer un fichier txt pour chaque fichier XML du dossier.
    Dans mon répertoire courant, quand je lance la fonction, j'ai bien 14 fichiers ( 7 fichiers XML) donc ma fonction fait bien son travail, mais je voudrais qu'elle le fasse aussi dans des sous dossiers. Ce qui n'est pas le cas ! Dans les sous dossiers, j'ai toujours mes xml ... normal... mais aucun TXT n'est généré !

    Quand je lance mon programme, j'ai ces message qui apparaissent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ./tata est un repertoire valide./toto est un repertoire valide
    Warning: simplexml_load_file() [function.simplexml-load-file]: transxml2.php:49: parser error : Start tag expected, '<' not found in /var/www/TRANSPERSO/transxml2.php on line 26
     
    Warning: simplexml_load_file() [function.simplexml-load-file]: in /var/www/TRANSPERSO/transxml2.php on line 26
     
    Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /var/www/TRANSPERSO/transxml2.php on line 26
    * Votre code manque de lisibilité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    
    function recursive_readdir ($dir) {
    
    // on verifie si c'est un repertoire
    if (is_dir ($dir))
    
    // on l'ouvre
    $handle = opendir($dir);
    
    else {
    echo $dir, ' n\' est pas u nrepertoire valide';
    exit;
    }
    
    // boucle pour parcourir le repertoire
    while(false !== ($file = readdir($handle))) {
        if($file != "." && $file != ".." && $file !="transxml.php") {
    
    // construction d'un chemin
    $path = $dir.'/'.$file;
    
    if (is_dir ($path)) {
    echo $path, ' est un repertoire valide';
    
    // appel recursif pour lire a l'interieur du repertoire
    recursive_readdir ($path);
    }
    else {
    // si c'est un fichier on applique la transformation : on le rend propre sans les balises 
            $sxml = simplexml_load_file($file);
            $titre = utf8_decode($sxml->Proprietes->Sujet);
            $texte = utf8_decode($sxml->Contenu);
    
            $texte = str_replace('?',"'",$texte);
            $texte = str_replace('\(','',$texte);
            $bad = array ('\cST\s','\cTI\s','\cTX\s','\cSG\s','\$','\dSG\t','\dDS1,2\t','\dFS\t','\dSN\t','\dSI\t','\cCH\s');
            $good = array ('','','',' ',' ','','','','','','');
            $texte = str_replace ($bad,$good,$texte);
    
            $titre = str_replace (' ','_',$titre);
    
    
    // on cree un txt pour chaque fichier nomme avec le titre contenu dans le fichier XML
            $fp = fopen ($titre.'.txt','w+');
            fputs ($fp,$texte);
            fclose ($fp);
            }
    }
    
    }
    closedir ($handle);
    }
    recursive_readdir ('.');
    ?>
    * Ne manque-t-il pas les accolades au bloc du (second) else ?
    En rajoutant les accolades, c'est la même chose

    Qu'est ce qui ne va pas dans le code ?

    merci d'avance

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function recursive_readdir($dir) {
        if (is_dir($dir)) {
            $handle = opendir($dir);
        } else {
            echo $dir, ' n\' est pas un repertoire valide';
            exit;
        }
        while(false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                $path = $dir . DIRECTORY_SEPARATOR . $file;
                if (is_dir($path)) {
                    echo $path, ' est un repertoire valide';
                    recursive_readdir($path);
                } elseif (preg_match('~\.xml$~', $file)) {
                    $sxml = simplexml_load_file($path);
                    $titre = utf8_decode($sxml->Proprietes->Sujet);
                    $texte = utf8_decode($sxml->Contenu);
                    $texte = str_replace('?', "'", $texte);
                    $texte = str_replace('\(', '', $texte);
                    $bad = array('\cST\s', '\cTI\s', '\cTX\s', '\cSG\s', '\$', '\dSG\t', '\dDS1,2\t', '\dFS\t', '\dSN\t', '\dSI\t', '\cCH\s');
                    $good = array('', '', '', ' ', ' ', '', '', '', '', '', '');
                    $texte = str_replace($bad, $good, $texte);
                    $titre = str_replace(' ', '_', $titre);
                    $fp = fopen($titre . '.txt', 'w');
                    fputs($fp, $texte);
                    fclose($fp);
                }
            }
        }
        closedir($handle);
    }
    Inutile de chercher à utiliser des fichiers non xml surtout lors d'une ultérieure exécution de ce script. Le chemin était faux/incomplet lors de l'appel à simplexml_load_file.

    J'espère que ça fonctionnera ainsi

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    OK, j'ai fait la modif, il n'y a plus de message d'erreur comme il y avait avant.

    CEpendant il reste le problème du traitement dans les sous-dossiers. Aucun fichier TXT n'est généré au lancement de monprog.php

    voi ci ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    .
    ..
    123456.xml
    234567.xml
    345678.xml
    monprog.php
    toto/
    tata/
    dans kles dossiers toto et tata , j'ai un fichier xml.

    Merci de m'aider car je ne sais plus quoi faire !!!

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Flûte, j'ai oublié de corriger le fopen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    $fp = fopen($dir . DIRECTORY_SEPARATOR . $titre . '.txt', 'w');

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    bravo ! et encore merci ! Je vais passé un bon week-end

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SimpleXML] Fichier identique dans sous-dossier diférent.
    Par voxiz dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/09/2012, 18h52
  2. [XL-2007] recherche fichiers dans sous-dossier
    Par casefayere dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/03/2010, 09h19
  3. Envoyer document par piece jointe dans sous dossier
    Par webmantoine dans le forum Configuration
    Réponses: 0
    Dernier message: 12/10/2009, 11h45
  4. [BATCH] Recherche dans sous-dossiers
    Par tonf dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 13/08/2008, 15h17
  5. Pb avec requete dans sous formulaire
    Par riccco dans le forum IHM
    Réponses: 2
    Dernier message: 18/05/2007, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo