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] probleme pour parser un fichier XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Points : 71
    Points
    71
    Par défaut [SimpleXML] probleme pour parser un fichier XML
    bonjour

    je veux pouvoir parser le document XML situé à cette adresse (cour des moneys) pour l'afficher en tableau html sur mon site
    http://www.ecb.europa.eu/stats/eurof...xref-daily.xml

    et il me resort un code du style

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    <gesmes:subject>Reference rates</gesmes:subject>
    <gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
    </gesmes:Sender>
    <Cube>
    <Cube time='2008-03-25'>
    <Cube currency='USD' rate='1.5569'/>
    <Cube currency='JPY' rate='155.90'/>
    <Cube currency='BGN' rate='1.9558'/>
    .........
    <Cube currency='SGD' rate='2.1527'/>
    <Cube currency='THB' rate='49.042'/>
    <Cube currency='ZAR' rate='12.5875'/>
    </Cube>
    </Cube>
    </gesmes:Envelope>
    comment faire ? avec des noeuds du style <Cube currency='ZAR' rate='12.5875'/>

    a+ gilles

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Salut,
    Si tu es en PHP5, je te conseil SimpleXML qui .. simplifie grandement le travail avec les fichier XML.

    Voici un bout de code permettant d'obtenir (je pense) ce que tu souhaite:
    Code php : 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
     
    <?php
    $xml_file = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
     
     
    //on crée un objet SimpleXMl à l'aide de notre fichier ou d'un liens vers un fichier XML valide
    $xml = new SimpleXMLElement($xml_file, null, true);//si 1er param = URL, le 3eme param doit être true
     
    echo 'Données obtenu a : ' . date('d/m/Y', strtotime($xml->Cube->Cube['time'])) . '<br />';
    echo 'Pour 1 EURO <br/>';
     
    print '<table border="1">';
    	print '<tr>';
    	print '<th>Monnaie</th>';
    	print '<th>Valeur</th>';
    	print '</tr>';
    foreach($xml->Cube->Cube->Cube as $cube) {
    	print '<tr>';
    	print '<td>'.(String)$cube['currency'].'</td>';
    	print '<td>'.(String)$cube['rate'].'</td>';
    	print '</tr>';
    }
    print '</table>';
     
    ?>

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    +
    Tu remarquera (String) pour caster (convertir) une type dans un autre. En effet SimpleXML crée un Objet et pour utiliser proprement les attributs il faut penser à les caster au moment ou tu les récupères. Cela t'évitera de futures perte de cheveux !

    +
    Autre chose, plus embettant, SimpleXML oublie complètement les noeuds contenant ":" tu peut le remarquer en affichant l'objet SimpleXML avec print_r
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    $xml_file = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
    $xml = new SimpleXMLElement($xml_file, null, true);//si 1er param = URL, le 3eme param doit être true
    print_r($xml);
    ?>
    Cela doit venir d'une norme ou autre ... Une solution qui me viens à l'esprit, c'est de lire le fichier comme un fichier text (file_get_contents) de remplacer a la dur les ":" par un contenu moins problématique "__" et de faire charger la nouvelle chaine XML de cette façon
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $xml_file = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
    $xml_datas = file_get_contents($xml_file);
    $xml_datas = str_replace(':', '__', $xml_datas);
    $xml = new SimpleXMLElement($xml_datas); //on charge le txt xml directement
     
    //suite des traitements
     
    (code non testé)

    C'est crade mais ca à le mérite de fonctionné tant que l'arbre XML n'est pas modifié à la source.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 181
    Points : 71
    Points
    71
    Par défaut
    merci pour vos reponses

    je suis encore en php4

    apparemment il y a pas simpleXML pour php4. Comment palier se probléme
    il y a bien ca
    Name: simplexml44 - PHP4 backport of PHP5 SimpleXML

    est que cela est equivalent ?

    dommage ton bout de code etais pas mal

    a+ gilles

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Salut,
    Je ne sais pas si ce portage de simpleXML est proche de la version de PHP5, je ne pense pas que toute les fonctionnalités soit portés (d'un point de vue orienté objet php4 est trop léger) mais peut être que l'essentiel y est!

    En PHP4 je me souvient avoir utiliser DOM XML (voir http://fr2.php.net/manual/fr/ref.domxml.php ) qui fonctionne mais qui n'est pas des plus pratiques de mémoire.

    En scrollant sur la page dom xml je suis tombé sur cette fonction, qui peut être te sera utile !
    Elle permet de transformer un arbre XML en un tableau associatif!
    Code php : 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
     
    function xml2array($domnode)
    {
        $nodearray = array();
        $domnode = $domnode->firstChild;
        while (!is_null($domnode))
        {
            $currentnode = $domnode->nodeName;
            switch ($domnode->nodeType)
            {
                case XML_TEXT_NODE:
                    if(!(trim($domnode->nodeValue) == "")) $nodearray['cdata'] = $domnode->nodeValue;
                break;
                case XML_ELEMENT_NODE:
                    if ($domnode->hasAttributes() )
                    {
                        $elementarray = array();
                        $attributes = $domnode->attributes;
                        foreach ($attributes as $index => $domobj)
                        {
                            $elementarray[$domobj->name] = $domobj->value;
                        }
                    }
                break;
            }
            if ( $domnode->hasChildNodes() )
            {
                $nodearray[$currentnode][] = xml2array($domnode);
                if (isset($elementarray))
                {
                    $currnodeindex = count($nodearray[$currentnode]) - 1;
                    $nodearray[$currentnode][$currnodeindex]['@'] = $elementarray;
                }
            } else {
                if (isset($elementarray) && $domnode->nodeType != XML_TEXT_NODE)
                {
                    $nodearray[$currentnode]['@'] = $elementarray;
                }
            }
            $domnode = $domnode->nextSibling;
        }
        return $nodearray;
    }
    ?>

    A utiliser comme ceci
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $xml_file = "http://.. .xml";
    $xml_dom= domxml_open_file($xml_file)
    $xml_array = xml2array($xml_dom);
     
    print_r($xml_array);

    Bon courage

Discussions similaires

  1. [DOM4J] Problème pour "parser" un fichier XML avec accents
    Par mlny84 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 26/11/2007, 19h06
  2. Réponses: 1
    Dernier message: 09/10/2007, 19h31
  3. [JDOM] Problème pour parser un fichier XML [débutant]
    Par adn013 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 16/05/2007, 12h00
  4. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  5. [SAX] Probleme pour parser un fichier
    Par aymron dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 25/11/2005, 15h48

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