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

Langage PHP Discussion :

PHP5 & simplexml


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut PHP5 & simplexml
    Bonjour,

    j'espere que je poste dans la bonne rubrique.

    dans le but de realiser un site web multilingue, j'ai opté pour la solution des fichiers textes qui seront probablement au format .xml (http://www.developpez.net/forums/d80...multi-langues/)
    mais je me pose quelques question par rapport a l'utilisation de simplexml.

    j'aurais un fichier du genre:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <language>
    	<text id="administration"><![CDATA[Administration]]></text>
    	<text id="associatedtemplate"><![CDATA[Associated template]]></text>
    	<text id="sortingdocumentofcategory"><![CDATA[Sorting child document of %s]]></text>
    	<text id="loadinprogress"><![CDATA[Load in progress]]></text>
    	<text id="documentmoved"><![CDATA[The document %s has been correctly moved to %s]]></text>
    	<text id="movingdocument"><![CDATA[Moving document]]></text>
    	<text id="movingtemplate"><![CDATA[Moving template]]></text>
    	<text id="documentnotallowedhere"><![CDATA[The document type %s is not allowed in the document type %s]]></text>
    	<text id="errorwhilemoving"><![CDATA[Error while moving]]></text>
    	<text id="configuration"><![CDATA[Configuration]]></text>
    	<text id="configurationgeneral"><![CDATA[General]]></text>
    	<text id="configurationsaves"><![CDATA[Backups]]></text>
    	<text id="never"><![CDATA[Never]]></text>
    	<text id="icon"><![CDATA[Icon]]></text>
    	<text id="status"><![CDATA[Status]]></text>
    	<text id="created_by"><![CDATA[Created by %1$s on %2$s]]></text>
    	<text id="creator"><![CDATA[Creator]]></text>	
    	<text id="change"><![CDATA[Change]]></text>
    	<text id="setchildrenstatus"><![CDATA[Set children status]]></text>
    	<text id="views"><![CDATA[Views]]></text>
    	<text id="view"><![CDATA[View]]></text>
    	<text id="import_tab"><![CDATA[Importer a tab]]></text>
    	<text id="published"><![CDATA[Published]]></text>
    	<text id="unpublished"><![CDATA[Unpublished]]></text>
    	<text id="validated"><![CDATA[Validated]]></text>
    	<text id="created"><![CDATA[Created]]></text>
    	<text id="showhide"><![CDATA[Show / Hide]]></text>
    </language>
    comment pourrais-je recuperer tout simplement la contenu de la balise qui a comme identifiant "creator" ???

    merci beaucoup

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Ce n'est pas la structure la plus adaptée pour l'utilisation de SimpleXML car pour un accès direct il faudrait que l'attribut id soit en réalité le nom de l'élément.

    Bref, pour exploiter ça :
    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
    <?php
    class I18N_SimpleXML {
        protected $locale;
        protected $sxml;
     
        # Constructeur à adapter/développer
        public function __construct($locale) {
            $this->locale = $locale;
            $this->sxml = simplexml_load_file(sprintf('%s.xml', $locale));
        }
     
        # tout est/doit être en UTF-8 (paramètres et valeur de retour)
        public function translate($msgid, $args = NULL) {
            $res = $this->sxml->xpath(sprintf('/language/text[@id = "%s"]', $msgid));
            if (!$res) {
                $msgstr = $msgid;
            } else {
                $msgstr = (string) $res[0];
            }
            if ($args) {
                return vsprintf($msgstr, $args);
            } else {
                return $msgstr;
            }
        }
    }
     
    $i18n = new I18N_SimpleXML('en');
    echo $i18n->translate('documentmoved', array('from', 'to'));
    echo PHP_EOL;
    echo $i18n->translate('unknown_term');
    The document from has been correctly moved to to
    unknown_term

  3. #3
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Je ne sais pas si tu as avancé. Mais avec un exemple aussi simple que celui-ci tu devrais comprendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    // Mets tes data XML dans le fichier cdata
    $xml = simplexml_load_file('cdata.xml');
     
    print "<pre>";
      print_r($xml);
    print "</pre>";
    ?>
    Tu sais probablement que le Parser XML ignore le CDATA ?

    Voici un truc simpliste mais qui fonctionne.
    Le fichier en.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <en>
    	<administration>Administration</administration>
    	<associatedtemplate>Associated template</associatedtemplate>
        <loadinprogress>Load in progress</loadinprogress>
    </en>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $xml = simplexml_load_file('en.xml');
     
    foreach( $xml as $value){
     
    	echo $value."<br>";
    }
    ?>

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    Merci les gars pour vos réponses...

    julp: merci pour le script mais j'avoue que je n'ai pas compris grand chose, je ne suis pas trop familier avec les classes et constructeurs...
    J’espérais qu'il ait un moyen simple pour récupérer le texte par exemple un getElementById...
    Ce n'est pas la structure la plus adaptée pour l'utilisation de SimpleXML car pour un accès direct il faudrait que l'attribut id soit en réalité le nom de l’élément
    Quelle structure me recommandes-tu?
    En fait on peut considérer que l'attribut id est le nom de l'élément, non??

    riete: merci a toi aussi pour ton aide.
    j'etais justement entrain d'explorer ta piste que j'ai trouve sur ce lien http://tecfa.unige.ch/guides/tie/htm...php-xml-4.html mais apparemment le CDATA me pose un problem, j'ai retiré CDATA des 2 ppremiers element puis en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $xml = simplexml_load_file("general.inc.xml") ;
    echo "<pre>";
      print_r($xml);
      echo "</pre>";
    j'obtiens ce resultat:
    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
    SimpleXMLElement Object
    (
        [text] => Array
            (
                [0] => Administration
                [1] => Associated template
                [2] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [id] => sortingdocumentofcategory
                            )
     
                    )
     
                [3] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [id] => loadinprogress
                            )
     
                    )
    ......
    Pourquoi il ne m'affiche pas le contenu des autres éléments ayant le CDATA?

    Déjà une chose avant que j'aille plus loi: est ce que c'est possible de modifier/ajouter/supprimer UN SEUL élément d'un fichier xml ??

    Merci

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par redah75 Voir le message
    quelle structure me recommandes tu?
    en fait on peut considerer que l'attribut id est le nom de l'element, non??
    Je pensais à :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <language>
    	<administration><![CDATA[Administration]]></administration>
    	<associatedtemplate><![CDATA[Associated template]]></associatedtemplate>
    	<sortingdocumentofcategory><![CDATA[Sorting child document of %s]]></sortingdocumentofcategory>
    	<loadinprogress><![CDATA[Load in progress]]></loadinprogress>
    	<!-- ... -->
    </language>
    Ainsi il suffit de faire $sxml->msgid pour avoir directement la traduction du msgid voulu ($sxml étant l'objet SimpleXMLElement). ($sxml->creator par exemple)

    Citation Envoyé par redah75 Voir le message
    deja une chose avant que j'aille plus loi: est ce que c'est possible de modifier/ajouter/supprimer UN SEUL element d'un fichier xml ??
    Oui Après tout dépend de la structure retenue : la structure initiale sera plus difficile à manipuler que celle ci-dessus (ajout : $sxml->addChild('msgid', 'valeur'), modification : $sxml->msgid = 'nouvelle_valeur', suppression : unset($sxml->msgid)).

    Sinon il y a bien sûr l'extension DOM pour des besoins/structures "avancés" (cf cet article également).

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    Ainsi il suffit de faire $sxml->msgid pour avoir directement la traduction du msgid voulu ($sxml étant l'objet SimpleXMLElement). ($sxml->creator par exemple)
    ah ouaiiiiisss
    j'ai modifié le fichier xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <language>
    	<a>Administration</a>
    	<b>Associated template</b>
    	<c><![CDATA[Sorting child document of %s]]></c>
    	<d><![CDATA[Load in progress]]></d>
    	<e><![CDATA[The document %s has been correctly moved to %s]]></e>
    	<f><![CDATA[Moving document]]></f>
    	<g><![CDATA[Moving template]]></g>
    	<h><![CDATA[The document type %s is not allowed in the document type %s]]></h>
    </language>
    J’ai ainsi pu facilement afficher mes textes avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xml = simplexml_load_file("general.inc.xml") ;
    echo $xml->a ou b ou c...;
    Merci beaucoup
    une petite question, j'avais lu quelque part il y a quelque temps qu'on est pas obligé de fermer les balises et qu'on pouvais utiliser autre chose a la place, ca te dit quelque chose?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Oui  Après tout dépend de la structure retenue : la structure initiale sera plus difficile à manipuler que celle ci-dessus (ajout : $sxml->addChild('msgid', 'valeur'), modification : $sxml->msgid = 'nouvelle_valeur', suppression : unset($sxml->msgid)).
    C’est génial, merci beaucoup, je vais faire des tests et vous tiens au courant.

    Merci merci merci mille fois )

  7. #7
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Citation Envoyé par redah75 Voir le message
    j'esperais qu'il ait un moyen simple pour recuperer le texte par par exemple un getElementById...
    Sans vouloir trop m'avancer, je crois que tu mélange un peu le Javascript et le PHP, car getElementById c'est du JS.

    Citation Envoyé par redah75 Voir le message
    pourquoi il ne m'affiche pas le contenu des autres elements ayant le CDATA?
    Regarde ce que j'ai écris plus haut
    Tu sais probablement que le Parser XML ignore le CDATA ?
    Apparement tu ne savais pas . Je vais me faire taper dessus, mais le parser, c'est la fonction interne à PHP qui va décortiquer ton code XML. Les CDATA sont ignorées. La "balise" CDATA permet d'évider des erreurs de lecture au Parser car il y a des caractères interdit en XML comme "&, <, #". Si tu veux mettre du code qui contient ce types de caractères tu utilise donc CDATA.
    Tu me suis ?

    Citation Envoyé par redah75 Voir le message
    deja une chose avant que j'aille plus loi: est ce que c'est possible de modifier/ajouter/supprimer UN SEUL element d'un fichier xml ??
    Je ne connais pas, mais regarde ceci xmlwriter

    PS: j'allais oublier, j'ai mis un exemple de code simpliste dans mon message précédant.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    Citation Envoyé par riete Voir le message
    Sans vouloir trop m'avancer, je crois que tu mélange un peu le Javascript et le PHP, car getElementById c'est du JS.
    hehe, pas du tout, je fais bien la distinction entre JS et le PHP, mais j'avais demande si un équivalent de getelementbyid existe )

    Regarde ce que j'ai écris plus haut
    J’avoue que je découvre un peu le XML, je ne m'en suis jamais servi. Y a un début à tout. Et fort heureusement que vous êtes la pour nous venir à l'aide

    merci en tout cas pour tout

  9. #9
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Citation Envoyé par redah75 Voir le message
    hehe, pas du tout, je fais bien la distinction entre JS et le PHP, mais j'avais demande si un equivalent de getelementbyid existe )
    j'avoue que je decouvre un peu le xml, je ne m'en suis jamais servi. y a un debut a tout. et fort heureusement que vous etes la pour nous venir a l'aide

    merci en tout cas pour tout
    J'espère que ce que j'ai écris t'auras quand même aidé, même si j'ai dit quelques anneries. Quelque fois on apprends soi même. J'ai trouver cette article qui introduit php/dom/xml .A+

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par riete Voir le message
    Sans vouloir trop m'avancer, je crois que tu mélange un peu le Javascript et le PHP, car getElementById c'est du JS.
    DomDocument::getElementById mais il faut ensuite que PHP ait connaissance de l'ID (via DTD par exemple).

    Citation Envoyé par redah75 Voir le message
    une petite question, j'avais lu quelque part il y a quelque temps qu'on est pas obligé de fermer les balises et qu'on pouvais utiliser autre chose a la place, ca te dit quelque chose?
    huh ? Si l'élément est vide ? (<a></a> = <a />) Sinon le document n'est pas (syntaxiquement) valide et le parser va échouer.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Par défaut
    huh ? Si l'élément est vide ? (<a></a> = <a />)
    ah oui c'etait ca, t'es trop fort

    je suis entrain de faire des tests pour modifier, ajouter et supprimer des element et tout marche bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $xml->addChild('z', '<![CDATA[valeur]]>');
    $xml->b = 'Ma nouvelle valeur';
    unset($xml->b);
    echo $xml->b;
    $xml->saveXML("general.inc.xml");
    le fichier .xml se presente de cette maniere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <language>
    	<a>Administration</a>
     
    	<c><![CDATA[Sorting child document of %s]]></c>
    	<d><![CDATA[Load in progress]]></d>
    	<e><![CDATA[The document %s has been correctly moved to %s]]></e>
    	<f><![CDATA[Moving document]]></f>
    	<g><![CDATA[Moving template]]></g>
    	<h><![CDATA[The document type %s is not allowed in the document type %s]]></h>
    <z>valeur</z></language>
    1- est il possible que lors dune suppression d'une ligne qu'il n'y ait pas cette ligne vide?
    2- lors d'une insertion d'un nouvel element, est il possible que </language> soit tout a la fin dans une nouvelle ligne?
    3- est il possible d'afficher les element par ordre alphabetique? (equivalent de sort() en PHP pour les array)?
    4- si je reexecute le script, l'element <z> va se recreer une autre fois, comment pourrais-je contoler ou gerer les doublons?

    Merci

Discussions similaires

  1. [SimpleXML] Configuration de php5 pour le XML
    Par hom dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 21/07/2006, 19h52
  2. [PHP5/simpleXML] Gros Fichiers
    Par vanilla dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 26/06/2006, 19h40
  3. [SimpleXML] Problème PHP5/XML pour des affichages particuliers
    Par vanilla dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 20/04/2006, 13h22
  4. Réponses: 3
    Dernier message: 23/08/2004, 17h49

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