[Objet]xml et simplexml.

xml et simplexml. [Objet] - PHP - Programmation

Marsh Posté le 26-12-2005 à 22:14:52    

Bonsoir à tous,  
 
Après quelques mois sans toucher au php et forcé de constater que CS ça rends abruti, je me replonge aux sources...
 
Mon fichier xml :

Code :
  1. <?xml version="1.0"?>
  2. <media>
  3. <text>
  4.   <id>titre</id>
  5.   <fr>le jolie titre</fr>
  6.   <en>the nice title</en>
  7. </text>
  8. <text>
  9.   <id>meta01</id>
  10.   <l>la premiere balise</l>
  11.   <en>the first tag</en>
  12. </text>
  13. </media>


 
Mon fichier php :

Code :
  1. <?php
  2. $xml = simplexml_load_file('./lang/lang.xml');
  3. echo "le titre est $titre et la première balise est $meta01";
  4. ?>


 
Le compte rendu simple xml :

Code :
  1. SimpleXMLElement Object
  2. (
  3.     [text] => Array
  4.         (
  5.             [0] => SimpleXMLElement Object
  6.                 (
  7.                     [id] => titre
  8.                     [fr] => le jolie titre
  9.                     [en] => the nice title
  10.                 )
  11.             [1] => SimpleXMLElement Object
  12.                 (
  13.                     [id] => meta01
  14.                     [fr] => la premiere balise
  15.                     [en] => the first tag
  16.                 )
  17.         )
  18. )


 
Ma question : Comment via simplexml(de préférence), dom attribuer par exemple "le jolie titre" à la variable $titre.
Toutes documentations, liens, exemples, solutions seront le bienvenue.  
 
Merci et bonne soirée à tous.


Message édité par 2xyo le 29-12-2005 à 15:14:53
Reply

Marsh Posté le 26-12-2005 à 22:14:52   

Reply

Marsh Posté le 28-12-2005 à 20:45:48    

Même pas 30 lectures en 24h ! Moi qui croyait que l'xml attirait les foules...


Message édité par 2xyo le 29-12-2005 à 15:12:04
Reply

Marsh Posté le 29-12-2005 à 15:13:08    

De nouveau bonjur à tous,  
j'ai un peu avancé dans mon code, mais pas temps que ça...
 
Voici mon code actuel :

Code :
  1. <?php
  2. $xml = simplexml_load_file('./lang.xml');
  3. $lg = "fr";
  4. $id = "titre";
  5. $titre = $xml->text[0]->$lg;
  6. print "<br/>lg = ".$lg."<br/>"
  7.      ."id = ".$id."<br/>"
  8.      ."titre = ".$titre
  9.      ."<br/><br/>";
  10.    
  11. $titre2 = $xml->text[0]->$id->$lg;
  12. print "<br/>lg = ".$lg."<br/>"
  13.      ."id = ".$id."<br/>"
  14.      ."titre2 = ".$titre2;
  15. ?>


Qui me restitue :
 

Code :
  1. lg = fr
  2. id = titre
  3. titre = le jolie titre
  4. lg = fr
  5. id = titre
  6. titre2 =


Donc, comme vous le constater, ça ne fonctionne pas...
En effet, comme j'ai éssayé de l'expliquer en haut, je souhaiterais attribuer à la variable $titre en fonctione de $lg(fr|en) le contenu de (fr|en).
 
Toutes aides seront le bienvenue.

Reply

Marsh Posté le 29-12-2005 à 17:54:37    

Me revoilà de nouveau, je ne lache pas l'affaire... :na:  
 
Me voici donc pourvu d'un nouveau code agrémenté xpath :

Code :
  1. <?php
  2. $xml = simplexml_load_file('./lang.xml');
  3. print_r($xml);
  4. $lg = "en";
  5. $id = "titre";
  6. $titre = $xml->text[0]->$lg;
  7. print "<br/>lg = ".$lg."<br/>"
  8.      ."id = ".$id."<br/>"
  9.      ."titre = ".$titre
  10.      ."<br/><br/>";
  11.    
  12. $titre2 = utf8_decode(trim($xml->xpath("//text[@id='titre']/".$lg)[0]));
  13. print_r($titre2);
  14. print "<br/>lg = ".$lg."<br/>"
  15.      ."id = ".$id."<br/>"
  16.      ."titre2 = ".$titre2;
  17. ?>


Et d'un nouveau fichier xml :

Code :
  1. <?xml version="1.0"?>
  2. <media>
  3. <text id="titre">
  4.     <fr>le jolie titre</fr>
  5.     <en>the nice title</en>
  6. </text>
  7. <text id="balise">
  8.     <fr>la premiere balise</fr>
  9.     <en>the first tag</en>
  10. </text>
  11. </media>


 
Malheureusement j'obtient seulement : Parse error: parse error, unexpected '[' in /homepages/htdocs/xml.php5 on line 12.  
 
J'ai effectué plusieurs modifications mais sans succès. :(

Reply

Marsh Posté le 30-12-2005 à 18:04:54    

Pour la parse error, je crois que PHP aime pas les [] après un appel de fonction. Passe par une variable intermédiaire qui stocke le résultat de $xml->xpath.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 02-01-2006 à 17:57:51    

Merci beaucoup !
 
Je résume :
lanf.xml :  

Code :
  1. <?xml version="1.0"?>
  2. <media>
  3. <text id="titre">
  4.     <fr>le jolie titre</fr>
  5.     <en>the nice title</en>
  6. </text>
  7. <text id="balise">
  8.     <fr>la premiere balise</fr>
  9.     <en>the first tag</en>
  10. </text>
  11. </media>


 
 
xml.php5 :

Code :
  1. <?php
  2. $xml = simplexml_load_file('./lang.xml');
  3. print_r($xml);
  4. $lg = "en";
  5. $id = "titre";
  6. $titre = $xml->text[0]->$lg;
  7. print "<br/>lg = ".$lg."<br/>"
  8.      ."id = ".$id."<br/>"
  9.      ."titre = ".$titre
  10.      ."<br/><br/>";
  11.    
  12. $lg2 = "fr";
  13. $xptitre = $xml->xpath("//text[@id='titre']/".$lg2);
  14. $titre2 = utf8_decode(trim($xptitre[0]));
  15. print "<br/>lg2 = ".$lg2."<br/>"
  16.      ."id = ".$id."<br/>"
  17.      ."titre2 = ".$titre2;
  18. ?>

Qui nous donne :

Code :
  1. SimpleXMLElement Object
  2. (
  3.     [text] => Array
  4.         (
  5.             [0] => SimpleXMLElement Object
  6.                 (
  7.                     [fr] => le jolie titre
  8.                     [en] => the nice title
  9.                 )
  10.             [1] => SimpleXMLElement Object
  11.                 (
  12.                     [fr] => la premiere balise
  13.                     [en] => the first tag
  14.                 )
  15.         )
  16. )
  17. lg = en
  18. id = titre
  19. titre = the nice title
  20. lg2 = fr
  21. id = titre
  22. titre2 = le jolie titre


 
Donc c'est bon, ça fonctionne :)  
 
Maintenant, je vais chercher un peu avant de revenir vous embêter de trouver un moyen d'éviter de faire x fois ceci :

Code :
  1. $titre = $xml->text[0]->$lg;
  2. $balise = $xml->text[1]->$lg;
  3. $pied = $xml->text[2]->$lg;
  4. etc...


Je vais m'amuser avec les boucles...
En effet, j'ai trouver sur un forum ceci :

Code :
  1. $xml = simplexml_load_file('./lang.xml');
  2. // parcours de toutes les balises text
  3. foreach ($xml->text as $text) {
  4.    $type = $text['id'];
  5.    $contenu = $text->$lg;
  6.    echo "$type : $contenu<br />";
  7. }


C'est un peut dans ce style mais pas vraiment ça... Je ne veux pas juste lister le contenu de mon fichier xml sous une "autre forme".
En effet voici un exmple avec mysql et PEAR que j'utilisais auparavant (je sais c'est pas très propre...) :

Code :
  1. $go = @$_GET['go'];
  2. if (isset($go) && file_exists("pages/".$go.".php" )){
  3. $go = str_replace("/",'',$go);
  4. $go = str_replace("\\",'',$go);
  5. }
  6. else {
  7. $go = "index";
  8. }
  9. require 'DB.php';
  10. $dsn = 'mysql://dbo116:ms3Nvbkz@d11.utun.com/db2116';
  11. $dbh = DB::connect($dsn);
  12. if (DB::isError($dbh)) { die ($dbh->getMessage());}
  13. $assoc = $dbh->getAssoc("SELECT * FROM meta WHERE page = '$go'" );
  14. DB::isError($assoc) and print 'erreur base de donn&eacute;e'.$assoc->getMessage();
  15. echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
  16.     ."\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
  17.     ."<html xml:lang=\"fr\" xmlns=\"http://www.w3.org/1999/xhtml\">\n"
  18.     ."\t<head>\n"
  19.     ."\t\t<title>\n"
  20.     ."\t\t\t".$assoc[$go][0]
  21.     ."\n\t\t</title>\n"
  22.     ."\t\t<meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=iso-8859-1\" />\n"
  23.     ."\t\t<meta http-equiv=\"expires\" content=\"0\" />\n"
  24.     ."\t\t<meta http-equiv=\"content-language\" content=\"fr\" />\n"
  25.     ."\t\t<meta http-equiv=\"pragma\" content=\"no-cache\" />\n"
  26.     ."\t\t<meta name=\"author\" content=\"yoyo\" />\n"
  27.     ."\t\t<meta name=\"keywords\" content=\"accueil, blog, potes, gnu, linux, hardware, site, contacte, liens, forum".$assoc[$go][2]."\" />\n"
  28.     ."\t\t<meta name=\"description\" content=\"".$assoc[$go][1]."\" />\n"
  29.     ."\t\t<meta name=\"revisit-after\" content=\"2 days\" />\n"
  30.     ."\t\t<meta name=\"date\" content=\"".$assoc[$go][3]."T20:49:37+00:00\" />\n"
  31.     ."\t\t<meta name=\"generator\" content=\"PSPad editor, www.pspad.com" />\n"
  32.     ."\t\t<meta name=\"expires\" content=\"never\" />\n"
  33.     ."\t\t<meta name=\"robots\" content=\"index,follow,noarchive\" />\n"
  34.     ."\t\t<meta name=\"rating\" content=\"general\" />\n"
  35.     ."\t\t<meta name=\"Date-Creation-yyyymmdd\" content=\"20041105\" />\n"
  36.     ."\t\t<meta name=\"DC.Title\" content=\"".$assoc[$go][0]."\" />\n"
  37.     ."\t\t<meta name=\"DC.Creator\" content=\"yoyo\" />\n"
  38.     ."\t\t<meta name=\"DC.Subject\" content=\"".$assoc[$go][1]."\" />\n"
  39.     ."\t\t<meta name=\"DC.Publisher\" content=\"yoyo\" />\n"
  40.     ."\t\t<meta name=\"DC.Contributor\" content=\"yoyo\" />\n"
  41.     ."\t\t<meta name=\"DC.Date\" content=\"".$assoc[$go][3]."\" />\n"
  42.     ."\t\t<meta name=\"DC.Type\" content=\"texte\" />\n"
  43.     ."\t\t<meta name=\"DC.Format\" content=\"text/html\" />\n"
  44.     ."\t\t<meta name=\"DC.Identifier\" content=\"http://mysite.com\" />\n"
  45.     ."\t\t<meta name=\"DC.Source\" content=\"all\" />\n"
  46.     ."\t\t<meta name=\"DC.Language\" content=\"fr\" />\n"
  47.     ."\t\t<meta name=\"DC.Relation\" content=\"index\" />\n"
  48.     ."\t\t<meta name=\"DC.Coverage\" content=\"France\" />\n"
  49.     ."\t\t<meta name=\"DC.Rights\" content=\"GNU sauf mentions contraires\" />\n"
  50.     #."\t\t<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"./style/lightblack.css\" />\n"
  51.     ."\t\t<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"./style/".$fstyle.".css\" />\n"
  52.     ."\t</head>\n"


Je cherche à avoir le même procédé d'utilisation, voir encor plus simple si c'est possible.

Reply

Marsh Posté le 04-02-2006 à 09:55:05    

Big up !  
 
 :heink:  
 
J'ai toujours pas trouvé comment faire... :ouch:
 
 
Je re-re-résume :
Mon fichier lang.xml :  

Code :
  1. <?xml version="1.0"?>
  2. <media>
  3. <text id="titre">
  4.     <fr>l_à'è"-'" )è-"éè-)é"è-)àtyi</fr>
  5.     <en>the nice title</en>
  6. </text>
  7. <text id="balise">
  8.     <fr>la premièytoytpzerytporyrre balise</fr>
  9.     <en>the first tag</en>
  10. </text>
  11. <text id="test2">
  12.     <fr>le test numéro 2</fr>
  13.     <en>The test number 2</en>
  14. </text>
  15. </media>


Mon fichier php :  

Code :
  1. $xml = simplexml_load_file('./lang.xml');
  2. $lg2 = "fr";   
  3. $titre0 = $xml->xpath("//text[@id='titre']/".$lg2);
  4. $titre = utf8_decode(trim($titre0[0]));
  5. $balise0 = $xml->xpath("//text[@id='balise']/".$lg2);
  6. $balise = utf8_decode(trim($balise0[0]));
  7. $test20 = $xml->xpath("//text[@id='test2']/".$lg2);
  8. $test2 = utf8_decode(trim($test20[0]));
  9. print "Le titre $titre<br/> avec la balise $balise<br/> et un test : $test2";


 
Je cherche le moyen d'éviter d'éffecter à chaque fois ceci pour chaque balise xml.

Code :
  1. $variable0 = $xml->xpath("//text[@id='variable2']/".$lg2);
  2. $variable2 = utf8_decode(trim($variable0[0]));


En gros, il faudrait que chaque //text[@id='unid']/".$lg2 corresponde à la varibale $unid.
 
J'ai fais quelques test avec des boucles foreach mais aucun concluant. Alors si quelqu'un pouvait me mettre sur la voie  :ange: (lien, doc, bout de code : toutes aides sont la bienvenue)


---------------
2 * yo = yoyo
Reply

Marsh Posté le 06-02-2006 à 17:57:58    

Un chti bout de code s'il vous plait :)


---------------
2 * yo = yoyo
Reply

Marsh Posté le 09-02-2006 à 13:40:34    

up  :bounce:


---------------
2 * yo = yoyo
Reply

Marsh Posté le 21-03-2006 à 19:02:37    

Un mois et demi plus tard et toujours pas trouvé !

Reply

Marsh Posté le 21-03-2006 à 19:02:37   

Reply

Marsh Posté le 21-03-2006 à 19:59:36    

En deux minutes, bon j'ai un peu changé le code mais cela fonctionne. A tester sur un plus gros fichier
 

Code :
  1. $xml = simplexml_load_file('test.xml');
  2. $lg2 = "fr";
  3. foreach($xml->text as $text){
  4. ${$text['id']} = utf8_decode(trim($text->$lg2));
  5. }
  6. print "Le titre $titre<br/> avec la balise $balise<br/> et un test : $test2";


 
Enfin en un mois tu aurais du trouver. J'ai travaillé avec simplexml dans la journée alors ca aide un peu  ;)

Message cité 1 fois
Message édité par Lord II le 21-03-2006 à 20:00:35
Reply

Marsh Posté le 22-03-2006 à 19:08:59    

Lord II a écrit :

En deux minutes, bon j'ai un peu changé le code mais cela fonctionne. A tester sur un plus gros fichier
 

Code :
  1. $xml = simplexml_load_file('test.xml');
  2. $lg2 = "fr";
  3. foreach($xml->text as $text){
  4. ${$text['id']} = utf8_decode(trim($text->$lg2));
  5. }
  6. print "Le titre $titre<br/> avec la balise $balise<br/> et un test : $test2";


 
Enfin en un mois tu aurais du trouver. J'ai travaillé avec simplexml dans la journée alors ca aide un peu  ;)


Merci !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed