Traitement d'un fichier XML en PHP

a marqué ce sujet comme résolu.

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 ;)

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 
}
+0 -0

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>.

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).

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.

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> ;)

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);
+0 -0

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 ? ^^

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é :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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