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 :

[XML] lecture d'un document XML


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut [XML] lecture d'un document XML
    Bonjour,

    Je suis entrain de développer une fonction qui lira un document XML pour de l'internationalisation.
    C'est la première dois que je lis un XML en PHP, je lutte ^^

    voici la forme de mon XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <stringList>
    	<msg id="Vous êtes connecté.">
    		<lang code="de">Sie sind angemeldet.</lang>
    		<lang code="en">You are logged.</lang>
    		<lang code="nl">U bent ingelogd.</lang>
    	</msg>
    	<msg id="Vous êtes déconnecté.">
    		<lang code="de">Sie sind getrennt.</lang>
    		<lang code="en">You are disconnected.</lang>
    		<lang code="nl">U bent niet aangesloten.</lang>
    	</msg>
    </stringList>
    Les ID des noeuds msg ne sont pas pratiques, mais je ne pense pas avoir le choix...

    J'ai commencé un code en PHP :
    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
    <?php
     
    function read($word, $language)
    {
        $doc = new DOMDocument();  
        $doc->load('internationalization.xml');
     
        $nodes = $doc->getElementsByTagName("msg");
        foreach($nodes as $ua)
        {  
            $code = $ua->getElementsByTagName("lang");
        }
    }
     
    read('Vous êtes déconnecté.', 'en');
     
    ?>
    Cependant j'aurais gravement besoin de vos lumières svp

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    J'ai essayé un autre code :

    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
    <?php
     
    function read($word, $language)
    {
        $doc = new DOMDocument('1.0', 'utf-8');
        $doc->validateOnParse = true;
        $doc->load('internationalization.xml');
     
        $news_node = $doc->getElementById($word);
        var_dump($news_node);
    }
     
    read(1, 'en');
     
    ?>
    Ce code me retourne NULL;

    ATTENTION ! J'ai temporairement changé les ID des balises msg ! les ID sont désormais 1 et 2.

  3. #3
    Expert éminent sénior

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Points : 19 374
    Points
    19 374
    Par défaut
    Bonjour,

    Je suis loin d'être un pro pour la lecture de XML, mais pourquoi mettre un paramètre $langue à ta fonction si tu ne l'utilises finalement pas ?
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Attention, XML, ce n'est pas HTML, il ne suffit pas de mettre un attribut id pour qu'il soit de type id
    DOMDocument::getElementById
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    FirePrawn :
    Je découvre à peine la lecture du XML en php, alors je fais ma fonction pas à pas. Bon, si on reprend mon xml tout en faut ... je passe en paramètre l'id, et je dois retourner la traduction (variable $language).

    Bovino :
    J'ai déja lu cette page du manuel PHP, je n'ai pas avancé pour autant :/

    J'attends vos suggestions svp.

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Etant donnée la nature de ce que tu essayes de faire et de la façon de récupérer les infos, je te conseillerais plutôt l'utilisation de simplexml avec une requête XPath...
    Sinon, ton second code n'a aucune raison de fonctionner puisqu'à priori, tu n'as pas de balise avec attributs de type id, quant au premier, la fonction read() ne retourne rien... donc son utilité en l'état est assez limitée
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    Bovino :

    ma fonction ne retourne rien car ... elle n'est pas fini. Je cherche à comprendre comment tout ça fonctionne. je lutte, je n'y arrive pas ...
    Un petit coup de main serait le bienvenue. J'essaie de coder avec simplexml mais je bloque... Pourriez-vous m'aider à écrire le code svp ?

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    simplexml_load_file
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xml->xpath('//msg[@id=...]/lang[@code=...]');
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    merci.
    mais apparemment, un id composé d'une chaine de caractère "Vous êtes déconnecté." est irrecevable. Je m'y attendais...
    J'ai pas mal de difficulté à m'en sortir :/

  10. #10
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    pour des raisons de simplicité, j'ai changé la structure de mon XML :

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <stringList>
    	<msg>
    		<fr>Vous êtes connecté.</fr>
    		<de>Sie sind angemeldet.</de>
    		<en>You are logged.</en>
    		<nl>U bent ingelogd.</nl>
    	</msg>
    	<msg>
    		<fr>Vous êtes déconnecté.</fr>
    		<de>Sie sind angemeldet.</de>
    		<en>You are disconnected.</en>
    		<nl>U bent ingelogd.</nl>
    	</msg>
    </stringList>

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Ben non, là ça va être plus compliqué puisque tu devras parcourir tous les noeuds pour vérifier s'ils correspondent au message souhaité.
    Le plus simple aurait été de renommer les id de ta version précédente pour qu'ils correspondent à un mot clé désignant la phrase cherchée...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  12. #12
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    malheureusement, le critère de recherche reste cette chaine de caractère...
    La base SQL sur laquelle je travaille a été créée avec la méthode "à l'arrache" plutôt que la méthode merise ...

    Je dois donc utiliser mes paramètres ... Je vous jure, je deviens dingue :/

  13. #13
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    je suis reparti sur votre bout de code Bovino !

    J'ai apporté quelques modifications :
    Pour éviter le problème avec les ID, j'ai encrypté en md5 les valeurs des ID.

    Voici donc mon code XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8" ?>
    <stringList>
    	<msg id="214440ccbbe2ede74cd47e53bd6edfbe">
    		<lang code="de">Sie sind angemeldet.</lang>
    		<lang code="en">You are logged.</lang>
    		<lang code="nl">U bent ingelogd.</lang>
    	</msg>
    	<msg id="5120a6ce6c505b5f757ae1428ab5afa3">
    		<lang code="de">Sie sind angemeldet.</lang>
    		<lang code="en">You are disconnected.</lang>
    		<lang code="nl">U bent ingelogd.</lang>
    	</msg>
    </stringList>
    mon code PHP :
    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
    <?php
     
    function read($word, $language)
    {
        $word = md5($word);
     
        $xml = simplexml_load_file('internationalization.xml');
        $res = $xml->xpath("//msg[@id='$word']/lang[@code='$language']");
     
        var_dump($res);
    }
     
    read('Vous êtes déconnecté.', 'en');
     
    ?>
    le programme PHP me retoune ceci au travers du var_dump() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(1) { [0]=> object(SimpleXMLElement)#2 (2) { ["@attributes"]=> array(1) { ["code"]=> string(2) "en" } [0]=> string(21) "You are disconnected." } }
    Comment puis-je extraire ma traduction ?

  14. #14
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    voici mon résultat final :

    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
    <?php
     
    function read($word, $language)
    {
        switch($language)
        {
            case 'fr' :
                echo $word;
            break;
     
            default :
                $word_xml = md5($word);
                $xml = simplexml_load_file('internationalization.xml');
                $res = $xml->xpath("//msg[@id='$word_xml']/lang[@code='$language']");
                list( , $node) = each($res);
                echo ($node == null) ? $word : $node;
            break;
        }
    }
     
    read('Vous êtes déconnecté.', 'de');
     
    ?>
    merci beaucoup à tous !

  15. #15
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    Désormais je dois ajouter une fonction write. Elle fonctionne quasiment, seul 2 lignes me posent problème :

    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
    function write($word, $translated_word, $language)
    {
        $word_xml = md5($word);
        $xml = simplexml_load_file('internationalization.xml');
     
        $element = $xml->xpath("//msg[@id='$word_xml']");
        $IfExists = ($element != null);
        // si l'élement msg 'fr' est inexistant
        if(!$IfExists)
        {
            // création de <msg id="...">
            $NewWord = $xml->addChild('msg');
            $NewWord->addAttribute('id', md5($word));
     
            // création de <lang code="...">...</lang>
            $NewTranslation = $NewWord->addChild('lang', $translated_word);
            $NewTranslation->addAttribute('code', $language);
        }
        // si l'élement msg 'fr' existe
        else
        {
            // si cette traduction n'existe pas
            $element_translation = $xml->xpath("//msg[@id='$word_xml']/lang[@code='$language']");
            $IfExists = ($element_translation != null);
            if(!$IfExists)
            {
                // création de <lang code="...">...</lang>
                $NewTranslation = $element->addChild('lang', $translated_word);
                $NewTranslation->addAttribute('code', $language);
            }
        }
     
        echo $xml->asXML();
    }
     
    write('Vous êtes déconnecté.', 'Se ha desconectado.', 'esp');
    J'ai l'erreur suivante à la ligne 28 (54 dans le fichier PHP) :
    Fatal error: Call to a member function addChild() on a non-object in E:\devpsh.net\translator\XmlReader.php on line 54
    je n'arrive pas à ajouter un texte à un noeud <msg> déjà existant O_o

  16. #16
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    j'ai trouvé !

    voici de quoi remplacer la ligne défectueuse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $NewTranslation = $element[0]->addChild('lang', $translated_word);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD14] Problème de lecture d'un document Xml
    Par drogba72 dans le forum WinDev
    Réponses: 2
    Dernier message: 08/01/2012, 20h59
  2. [Débutant] Lecture dans un document XML
    Par CJiwan dans le forum C#
    Réponses: 4
    Dernier message: 15/09/2011, 20h27
  3. Lecture d'un document word ou pdf
    Par Terminator dans le forum WinDev
    Réponses: 2
    Dernier message: 22/02/2009, 20h17
  4. [SimpleXML] Lecture d'un document XML avec PHP 4
    Par FredericB dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/02/2008, 17h49
  5. [SimpleXML] Lecture d'un document XML
    Par shivka dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/10/2007, 20h12

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