Traitement d'un fichier XML en PHP

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Étant en pleine création d'un site web pour m'entrainer, j'aimerai récupérer des données d'un fichier XML, je précise ma demande :

Dans mon fichier .xml, j'ai des balise du type : <S N="comment">…</S>

J'aimerai savoir comment récupérer uniquement le contenu des ces balise (je me débrouillerai pour la mise en forme). J'ai tester ça :

1
2
3
4
5
$fichier = 'fichier_xml.xml';
$xml = simplexml_load_file($fichier);
foreach($xml as $personne){
    echo $personne->nom.'<br>'; 
}

Mais rien n'y fais, ça me ressort du blanc ^^ du coup j'aurai bien besoin d'un petit coup de pouce :)

Merci pour votre aide ;)

+0 -0
Staff

Je pense qu'il faudrait mieux que tu utilise XPath pour sélectionner les bonnes balises puis faire un __toString

donc tu aurais quelque chose comme

1
2
3
4
5
6
7
8
9
<?php
$fichier = 'fichier_xml.xml';
$xml = simplexml_load_file($fichier);
foreach($xml->xpath("//S") as $personne){
    echo $personne->__toString().'<br>'; // affiche le contenu entre la balise ouvrante et fermante
    //exemple : <S>absc</S> => cela affiche absc
    echo $personne->N; // affiche le contenu de l'attribut N
    //exemple : <S N="comment">…</S> => affiche comment 
}

Édité par artragis

+0 -0
Auteur du sujet

Salut Artagis :)

Merci pour ta réponse, j'ai juste remarqué une petite erreur dans ton script : à la ligne 4, dans la déclaration du foreach, tu as oublié une parenthèse ^^ (entre "//S" et "as"). Et ça m'affiche toujours une page blanche :/

+0 -0
Auteur du sujet

Je viens de le mettre, aucun changement, j'aurai peut-être dû préciser que j'utilise un framework (codeigniter) ? Voici un extrait de mon fichier xml :

1
2
3
4
5
6
  <Obj RefId="1">
    <TNRef RefId="0" />
    <MS>
      <S N="comment">NUC - NTETRA007 - HP DESIGNJET T920</S>
    </MS>
  </Obj>

Le reste est similaire (au niveau des balise). Il y a juste le RefId de la balise <Obj> ainsi que le contenu de la balise <S>.

+0 -0
Staff

Je te propose de regarder cette vidéo pour que tu puisses débugger ton script.

ENsuite il faudra que tu actives les erreurs dans ton php.ini car là c'est typiquement ce qu'il se passe.

PS : peux-tu nous donner le code complet de ta page?

Édité par artragis

+0 -0
Auteur du sujet

Je vais regarde ça, merci :) voici le code complet de ma page :

  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
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <link rel="stylesheet" href="../assets/dist/css/bootstrap.min.css">
        <link rel="stylesheet" href="../assets/dist/css/navbar.css">
    </head>
    <body>
        <div class="container">
            <div class="col-md-4 col-md-offset-4">
                <div class="col-md-12">

                    <?php echo form_open('index/add/'); ?>
                        <div class="form-group">
                            <label for="ville">Serveur :</label>
                            <select name="ville" id="select_ville" class="form-control" onchange="get_ville();">
                                <option selected>Veuillez choisir une ville</option>
                                <optgroup label="Nord">
                                    <option value="SVRBLG001">Boulogne</option>
                                    <option value="SVRLSQ001">Lesquin</option>
                                    <option value="SVRAMI001">Amiens</option>
                                    <option value="SVRROU001">Rouen</option>
                                    <option value="SVRREI001">Reims</option>
                                </optgroup>
                                <optgroup label="Ouest">
                                    <option value="SVINTE001">Nantes</option>
                                    <option value="SVRCAE001">Caen</option>
                                    <option value="SVRBRE002">Brest</option>
                                    <option value="SVRQPR001">Quimper</option>
                                    <option value="SVRLRT001">Lorient</option>
                                    <option value="SVRRNS001">Rennes</option>
                                    <option value="SVRANG001">Angers</option>
                                    <option value="SVRLRH001">La Rochelle</option>
                                </optgroup>
                                <optgroup label="Centre">
                                    <option value="SVRCBV001">Courbevoie</option>
                                    <option value="SVRMLK001">Paris</option>
                                    <option value="SVRLOG001">Lognes</option>
                                    <option value="SVRBRY001">Bry</option>
                                    <option value="SVRORL001">Orléans</option>
                                    <option value="SVRTRS001">Tours</option>
                                </optgroup>
                                <optgroup label="Est">
                                    <option value="SVRDJI001">Dijon</option>
                                </optgroup>
                                <optgroup label="Sud">

                                </optgroup>
                                <optgroup label="DOM-TOM">

                                </optgroup>
                            </select>
                        </div>
                        <div class="checkbox" id="div_imp" style="display:none">
                            <label for="imprimante" id="label_imp"></label>
                            <select multiple name="imprimante" id="select_imp" class="form-control" onchange="get_imp();">
                                <option selected>Veuillez choisir une imprimante</option>
                                <option value="NTEIMP001">NTEIMP001</option>
                                <option value="NTEIMP002">NTEIMP002</option>
                                <option value="NTEIMP003">NTEIMP003</option>
                                <option value="NTEIMP004">NTEIMP004</option>
                                <option value="NTEIMP005">NTEIMP005</option>
                                <option value="NTEIMP006">NTEIMP006</option>
                            </select>
                        </div>
                        <br>
                        <div id="div_resume" style="display:none">
                            <div class="well">
                                <p>Chemin de(s) l'imprimante(s) à ajouter :</p>
                                <p><strong><span id="resume_ville"></span> / <span id="resume_imp"></span></strong></p>
                            </div>

                            <input class="btn btn-success btn-block" type="submit" value="Confirmer">
                        </div>
                    <?php echo form_close(); ?>
                </div>
            </div>
        </div>
        <?php
            error_reporting(E_ALL);
            $file = 'C:\wamp\www\ADDIMP\assets\data\imp.xml';
            $xml = simplexml_load_file($file);
            foreach($xml->xpath("//S") as $imp){
                echo $imp->__toString().'<br>';
                echo $imp->N;
            }
        ?>
    </body>
    <script type="text/javascript">
        function get_ville(){
            var div_ville = document.getElementById('select_ville');
            var div_imp = document.getElementById('div_imp');
            var label_imp = document.getElementById('label_imp');
            var resume_ville = document.getElementById('resume_ville');
            var value_ville = div_ville.value;

            div_imp.style= "";
            label_imp.innerHTML = "Imprimante ("+value_ville+")";
            resume_ville.innerHTML = value_ville;
        }
        function get_imp(){
            var div_imp = document.getElementById('select_imp');
            var div_resume = document.getElementById('div_resume');
            var resume_imp = document.getElementById('resume_imp');
            var value_imp = div_imp.value;

            div_resume.style = "";
            resume_imp.innerHTML = value_imp;
        }
    </script>
</html>

J’omets le code du controller car il ne fais que charger mes vues (pour le moment en tout cas).

+0 -0
Staff

il ne serait guerre étonnant que ça soit cette fonction le problème echo form_open('index/add/').

regarde le code html généré par ton php (dans ton navigateur, click droit, code source de la page). s'il n'y a rien ou juste le <head> c'est de ce côté là (ou de ton contrôleur) qu'il faudra regarder.

+0 -0
Auteur du sujet

Je ne sais pas si tu as déjà utilisé le framework wodeigniter, mais la fonction form_open('index/add/') est une fonction propre à ce framework, il me sert à viser une fonction de mon controler pour récuperer les données de mon formulaire ;) il correspond enfaite à un <form method="post" action="index/add/">…</form> ;)

+0 -0

J'aimerai savoir comment récupérer uniquement le contenu des ces balise (je me débrouillerai pour la mise en forme). J'ai tester ça :

1
2
3
4
5
$fichier = 'fichier_xml.xml';
$xml = simplexml_load_file($fichier);
foreach($xml as $personne){
  echo $personne->nom.'<br>'; 
}

Mais rien n'y fais, ça me ressort du blanc ^^ du coup j'aurai bien besoin d'un petit coup de pouce :)

ProToXiDe

J'ai testé vite fait avec un sitemap.xml (à la racine du projet) en me basant sur cette doc : http://php.net/manual/fr/simplexml.examples-basic.php

1
2
3
4
5
6
7
<?php
$this->load->helper('file');
// Lecture brut du fichier
$file = read_file('sitemap.xml');
// Transformation en object
$xml = new SimpleXMLElement($file);
var_dump($xml);

HTTP/1.1 418 I'm a teapot

+0 -0

Salut !

Je ne suis pas certain que error_reporting(E_ALL) ait un effet si on n'a pas demandé d'afficher les messages d'erreur avec ini_set('display_errors', 'on'). Essaie de l'ajouter pour voir ?

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

Salut EtienneR et Ymox,

@EtienneR : Je viens d'essayer ton petit script, il y a du mieux, j'ai un affichage de mon fichier XML, mais je ne vois pas le contenu de mes balise <S>, de plus, comment je pourrai ne sélectionner que cette dernière avec la méthode SimpleXMLElement ?

@Ymox : J'ai tester avec le ini_set devant, aucun changement, Codeigniter n'a-t-il pas un "système" de gestion des erreur ? J'entends par la qu'il s'occupe de les afficher s'il y en a ? ^^

+0 -0
Auteur du sujet

C'est bon, j'ai réussi à faire ce que je cherchais à faire :) Pour info, voici le petit script :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// Mon controller
    public function home()
    {
        //shell_exec('powershell -executionpolicy remotesigned -command "&{"C:\wamp\www\ADDIMP\assets\cgi\get_imp.ps1";exit $err}"');

        $this->load->helper('form');
        $this->load->helper('file');

        $file = read_file('C:\wamp\www\ADDIMP\assets\data\imp.xml');
        $data['list_imp'] = new SimpleXMLElement($file);

        $this->load->view('tooltab');
        $this->load->view('form', $data);
    }
1
2
3
4
5
6
// Ma vue
<?php
foreach($list_imp->Obj as $imp){
    echo '<option>', $imp->MS->S, '</option>', PHP_EOL;
}                               
?>

PS : Merci EtienneR pour ton lien qui m'a beaucoup aidé :)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte