Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2007, 10h53   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 63
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 63
Points : 14
Points : 14
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 :
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 ('.');
?>
astrolane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 11h21   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
  • "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 ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 11h56   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 63
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 63
Points : 14
Points : 14
* "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 :
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 :
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
astrolane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 12h28   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
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
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h30   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 63
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 63
Points : 14
Points : 14
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 :
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 !!!
astrolane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h41   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Flûte, j'ai oublié de corriger le fopen :
Code :
                $fp = fopen($dir . DIRECTORY_SEPARATOR . $titre . '.txt', 'w');
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h51   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 63
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 63
Points : 14
Points : 14
bravo ! et encore merci ! Je vais passé un bon week-end
astrolane est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h53.


 
 
 
 
Partenaires

Hébergement Web