Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/08/2011, 12h12   #1
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
Par défaut 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 :
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 :
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
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 12h55   #2
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
J'ai essayé un autre code :

Code :
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.
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h12   #3
Modérateur
 
Avatar de FirePrawn
 
Homme Sébastien
Ingénieur réalisateur
Inscription : mars 2011
Messages : 776
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 24
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ingénieur réalisateur
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 776
Points : 2 344
Points : 2 344
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.
- avant de poster
- Je ne réponds pas aux questions techniques en MP.
FirePrawn est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h15   #4
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 793
Points : 35 793
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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h35   #5
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
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.
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h43   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 793
Points : 35 793
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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h09   #7
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
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 ?
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h16   #8
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 793
Points : 35 793
simplexml_load_file
Code :
$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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h28   #9
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
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 :/
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h49   #10
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
pour des raisons de simplicité, j'ai changé la structure de mon XML :

Code :
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>
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h55   #11
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 793
Points : 35 793
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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h59   #12
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
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 :/
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 17h04   #13
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
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 :
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 :
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 :
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 ?
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 17h14   #14
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
voici mon résultat final :

Code :
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 !
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 18h18   #15
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

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

Code :
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) :
Citation:
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
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 18h26   #16
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
j'ai trouvé !

voici de quoi remplacer la ligne défectueuse :
Code :
$NewTranslation = $element[0]->addChild('lang', $translated_word);
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h35.


 
 
 
 
Partenaires

Hébergement Web