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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Parser XML avec PHP pour générer du JS


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Parser XML avec PHP pour générer du JS
    Bonjour à tous,

    Après un titre barbar, je vous dois quelques explications.
    Le but étant de faire un module Drupal avec la librairie www.highcharts.com/demo/

    J'ai toute la mécanique sauf la génération du JS de config qui me pose problème.
    je dois obtenir le JS suivant (si c'est plus simple pour vous à comprendre ce sera une chaîne de caractère dans mon module):
    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
    57
    58
    59
    var chart;
    jQuery(document).ready(function() {
       chart = new Highcharts.Chart({
          chart: {
             renderTo: 'container',
             defaultSeriesType: 'column'
          },
          title: {
             text: 'Monthly Average Rainfall'
          },
          subtitle: {
             text: 'Source: WorldClimate.com'
          },
          xAxis: {
             categories: [ 'Jan', 'Feb', 'Mar', 'Apr', 
                'May', 
                'Jun', 
                'Jul', 
                'Aug', 
                'Sep', 
                'Oct', 
                'Nov', 
                'Dec'
             ]
          },
          yAxis: {
             min: 0,
             title: {
                text: 'Rainfall (mm)'
             }
          },
          legend: {
             layout: 'vertical',
             backgroundColor: '#FFFFFF',
             align: 'left',
             verticalAlign: 'top',
             x: 100,
             y: 70,
             floating: true,
             shadow: true
          },
          series: [{
            name: 'Tokyo',
            data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
          }, {
            name: 'New York',
            data: [83.6, 78.8, 98.5, 93.4, 106.0, 84.5, 105.0, 104.3, 91.2, 83.5, 106.6, 92.3]
     
          }, {
             name: 'London',
             data: [48.9, 38.8, 39.3, 41.4, 47.0, 48.3, 59.0, 59.6, 52.4, 65.2, 59.3, 51.2]
     
          }, {
             name: 'Berlin',
             data: [42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8, 51.1]
     
          }]
       });
    });
    Depuis le XML suivant:
    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
    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    <?xml version="1.0" encoding="UTF-8"?>
     
    <root>
     
      <chart>
        <renderTo>container</renderTo>
        <defaultSeriesType>column</defaultSeriesType>
      </chart>
     
      <title>
        <text><![CDATA[Monthly Average Rainfall]]></text>
      </title>
     
      <subtitle>
        <text><![CDATA[Monthly Average Rainfall]]></text>
      </subtitle>
     
      <xAxis>
        <categories>
          <categorie>Jan</categorie>
          <categorie>Feb</categorie>
          <categorie>Mar</categorie>
          <categorie>Apr</categorie>
          <categorie>May</categorie>
          <categorie>Jun</categorie>
          <categorie>Jul</categorie>
          <categorie>Aug</categorie>
          <categorie>Sep</categorie>
          <categorie>Oct</categorie>
          <categorie>Nov</categorie>
          <categorie>Dec</categorie>
        </categories>
        <title></title>
      </xAxis>
     
      <yAxis>
        <min>0</min>
        <max></max>
        <title><![CDATA[Rainfall (mm)]]></title>
      </yAxis>
     
      <legend>
        <layout>vertical</layout>
        <align>left</align>
        <verticalAlign>top</verticalAlign>
        <x>100</x>
        <y>70</y>
        <floating>true</floating>
        <shadow>true</shadow>
      </legend>
     
      <series>
        <serie>
          <name>Tokyo</name>
          <datas>
            <data>49.9</data>
            <data>71.5</data>
            <data>106.4</data>
            <data>129.2</data>
            <data>144.0</data>
            <data>176.0</data>
            <data>135.6</data>
            <data>148.5</data>
            <data>216.4</data>
            <data>194.1</data>
            <data>95.6</data>
            <data>54.4</data>
          </datas>
        </serie>
        <serie>
          <name>New York</name>
          <datas>
            <data>83.6</data>
            <data>78.8</data>
            <data>98.5</data>
            <data>93.4</data>
            <data>106.0</data>
            <data>84.5</data>
            <data>105.0</data>
            <data>104.3</data>
            <data>91.2</data>
            <data>83.5</data>
            <data>106.6</data>
            <data>92.3</data>
          </datas>
        </serie>
        <serie>
          <name>London</name>
          <datas>
            <data>48.9</data>
            <data>38.8</data>
            <data>39.3</data>
            <data>41.4</data>
            <data>47.0</data>
            <data>48.3</data>
            <data>59.0</data>
            <data>59.6</data>
            <data>52.4</data>
            <data>65.2</data>
            <data>59.3</data>
            <data>51.2</data>
          </datas>
        </serie>
        <serie>
          <name>Berlin</name>
          <datas>
            <data>42.4</data>
            <data>33.2</data>
            <data>34.5</data>
            <data>39.7</data>
            <data>52.6</data>
            <data>75.5</data>
            <data>57.4</data>
            <data>60.4</data>
            <data>47.6</data>
            <data>39.1</data>
            <data>46.8</data>
            <data>51.1</data>
          </datas>
        </serie>
      </series>
    </root>
    La structure XML est de moi, elle peut être modifiée.
    Je me suis dis qu'un algo récursif serait le plus approprié mais comme il y a plusieurs façon d'écrire les arguments.

    Ma première question, selon vous, quelle est la librairie la plus adaptée pour parser le XML j'ai utilisé DOM (http://eusebius.developpez.com/php5dom/)
    Ensuite, je suis parti sur un parcours avec des foreach sur mon objet mais je me rend compte que ce n'est pas viable car j'ai deja 3 boucles imbriqués et je n'ai pas traité toutes les possibilités.
    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
    $xml_obj = fileToObject($xml_filename);
    $custom = "";
        foreach ($xml_obj->root->children as $niv1) {
          //niv 1
          $custom .= $niv1->name . ":{\n\t";
          if (isset($niv1->children)) {
            $items = array();
            foreach ($niv1->children as $niv2) {
              if (isset($niv2->children)) {
                $niv2_output = '';
                $niv2_elemts = array();
                $niv2_output .= $niv2->name .": [";
                foreach($niv2->children as $niv3){
                  if($niv3->textValue)
                    $niv2_elemts[] = "'". $niv3->textValue . "'";
                }
                $niv2_output .= implode(",",$niv2_elemts);
                $items[] .= $niv2_output . "]";
              } else {
                $items[] = $niv2->name . ": '" . $niv2->textValue ."'";
              }
            }
            $custom .= implode(",\n\t", $items);
          }
          $custom .= "\n}, \n\n";
        }
    Alors je voudrais repartir sur de bonne bases avec un algo propre d'où ce post

    Si vous avez des questions, n'hésitez pas.

    Par avance merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    SimpleXML pour le XML

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Ok je vais deja essayer SimpleXML l'objet sera peut-être plus facile à parcourir

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ensuite json_encode pour faire du javascript

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Non pour ça je vais utiliser qui va me rajouter le code dans le cache de la page, c'est plus pour l'algo de génération de ce dernier que je suis dans la choucroute ..

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ton "algo" c'est json_encode

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Effectivement ..
    j'y suis presque j'ai juste quelques soucis avec les quottes.
    dans mon xml si je veux eviter qu'il mettent des entre chaque valeur de type integer des idées ?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par hitmax Voir le message
    Effectivement ..
    j'y suis presque j'ai juste quelques soucis avec les quottes.
    dans mon xml si je veux eviter qu'il mettent des entre chaque valeur de type integer des idées ?
    dans le XML ? le json plutôt ?

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Oui mon json ressemble à ça : http://pastie.org/2072127

    mais toute mes valeurs entières sont entourées de quottes.

    J'ai donc pensé qu'il fallait que la syntaxe de mon XML soit différente pour qu'il interprète pendant l'encodage du json.

    Une idée ? :/
    merci de ton aide

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par hitmax Voir le message
    Oui mon json ressemble à ça : http://pastie.org/2072127

    mais toute mes valeurs entières sont entourées de quottes.

    J'ai donc pensé qu'il fallait que la syntaxe de mon XML soit différente pour qu'il interprète pendant l'encodage du json.

    Une idée ? :/
    merci de ton aide
    t'as pas trop le choix, y'a pas de typage dans le XML, mais je ne vois pa le problème puisque coté js il fera le typage tout seul

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Alors c'est la librairie Hightchars qui interprète ça comme une chaîne de caractère et du coup je suis chocolat

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par hitmax Voir le message
    Alors c'est la librairie Hightchars qui interprète ça comme une chaîne de caractère et du coup je suis chocolat
    t'as une erreur ?

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Valeur NaN inattendue lors de l'analyse de l'attribut x.

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Je vais me débrouiller, merci de ton aide

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    montre ton code pour générer ton json

  16. #16
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $xml = simplexml_load_file( $xml_filename);
    json_encode(new SimpleXMLElement($xml->asXML(), LIBXML_NOCDATA))

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    comme ça pas trop le choix

  18. #18
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Fait le test : http://jsfiddle.net/hitmax/KPsAv/

    dans legend x et y enlève les quottes.


Discussions similaires

  1. Parser XML avec jQuery pour un attribut fixé
    Par tonio17 dans le forum jQuery
    Réponses: 7
    Dernier message: 14/12/2011, 20h19
  2. [XML] parser un fichier xml avec php pour refaire un xml.
    Par steve3000 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/10/2008, 10h22
  3. [DOM XML] Insertion données dans fichier XML avec PHP pour Flash ?
    Par ExSter dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 10/05/2006, 11h16
  4. [XML] [EXPAT] Parser un fichier xml avec php
    Par Dargos dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 05/04/2006, 12h25
  5. [XML] [EXPAT] Parser XML avec PHP
    Par glsn dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 20/12/2005, 12h29

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