Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
A partir d'une base de donnée, je dois récupérer des informations et générer un xml avec un DOM très précis et spécifique. Dans zf2 existe-t-il un moyen de générer des xml simplement et de manière assez flexible ?
J'ai regardé Zend\Config\Writer sur le principe c'est ce qu'il me faudrait :
[lang=php] // Create the config object $config = new Zend\Config\Config(array(), true); $config->production = array(); $config->production->webhost = 'www.example.com'; $config->production->database = array(); $config->production->database->params = array(); $config->production->database->params->host = 'localhost'; $config->production->database->params->username = 'production'; $config->production->database->params->password = 'secret'; $config->production->database->params->dbname = 'dbproduction'; $writer = new Zend\Config\Writer\Xml(); echo $writer->toString($config);
Mais c'est pour de la config uniquement non ? Car la manière de faire est assez élégante.
Y a t'il un module créée par quelqu'un qui me permettrait de faire ce travail ?
Je pose cette question pour en fait voir s'il y a une solution plus élégante que de générer son XML de cette manière.. :
[lang=php] $test = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Document xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"blabla\" DocumentDate=\"$date_test\" DocumentNum=\"{{CODTEST}}\">" .PHP_EOL; $test .= "<Header DocTypCod=\"380\">" .PHP_EOL; $test .= "<BenefitDate><SimpleDate SimpleDateVal=\"$dt_valid\"/></BenefitDate>" .PHP_EOL; //...
J'ai déjà essayé la solution PHP avec :
[lang=php] $dom = new \DomDocument("1.0", "UTF-8");
Mais c'est assez complexe pour un xml de grande taille. Si jamais vous avez besoin de plus d'info n'hésitez pas.
Hors ligne
Et tu a un tableau à mettre en xml?
ou juste pleins de valeur à placer un peu "aléatoirement"?
Hors ligne
Je vais chercher grâce a mes requêtes plein de donnée dans ma base et je dois organiser un XML qui ordonne toutes ces données, je n'ai pas de tableau au préalable non.
J'ai regardé un peu le module XMLRpc, là il y a une partie Générator qui utilise le domDocument, on dirait que c'est une surcouche de cette classe mais cette partie me semble un peu légère et je ne sais même pas si ça pourrait convenir pleinement à ce que je veux.
Si tu as une idée à me donner n'hésites pas merci de ta réponse.
Hors ligne
En fouillant un peu je suis tombé la dessus :
[lang=php] <?php $test_array = array ( 'bla' => 'blub', 'foo' => 'bar', 'another_array' => array ( 'buil' => 'myxml', ), ); $xml = new SimpleXMLElement('<root/>'); array_walk_recursive($test_array, array ($xml, 'addChild')); print $xml->asXML(); //donnerait: <?xml version="1.0"?> <root> <blub>bla</blub> <bar>foo</bar> <myxml>build</myxml> </root>
ça impliquerai de créer ton tableau avant et ensuite de le convertir en xml...
c'est pas bien mieux mais j'ai pas de meilleure idée.. ^^
Hors ligne
Oui je vois, j'avais déjà vu un truc du genre de passer par un array et le convertir en xml.
Via cette méthode l'inconvénient, c'est pour construire des balises de ce type :
<mesLines> <line lineNum="monNum"> </line> <line lineNum="monNum2"> </line> </mesLines
Et ces <line> seront générés par un foreach...Comme mon post sur sdz le montre :
http://fr.openclassrooms.com/forum/suje … e-85465183
Avec DomDocument en fait j'ai un début de résultat, sauf que le code est déjà très long pour a peine 30% du Xml traité. L'ajout de child, de paramètre etc... pour 30% du xml je dois être à 300 lignes de code.
C'est pour cela que ma question de savoir si Zend avait déjà un module, fonctionnalité qui permettrait de faire un truc moins complexe tout en ne perdant pas de flexibilité, ou si il faut le créer.
Merci pour ta réponse.
Hors ligne
Et bien pas à ma connaissance,
dsl ^^
EDIT : De ce que j'en ai vu en regardant un peu pour ton problème, tu sera obligé de passer par DomDocument =x
Dernière modification par flobrflo (24-04-2014 16:38:22)
Hors ligne
Ok merci beaucoup d'avoir regardé (je viens de me re-pencher sur le soucis).
DomDoucment hum.... faut que je maîtrise cette classe sur le bout des ongles pour faire un truc optimisé en gros car un générateur qui fait plus de 1000 lignes autant le faire en procédural et gérer la génération avec une chaîne concaténé non ? :p
Hors ligne
ben tout dépend avec ce dont tu es le plus à l'aise et s'il y a un certains modèle qui se répète dans tes 1000 lignes ^^
Tu t'en sortira certainement bien avec plusieurs boucles imbriquées
Hors ligne
c'est plutôt pour construire l'arbo ou je vais souvent répéter les createElement et les appendChild & les setAttribute... C'est surtout sur ce point ou j'aurais aimé optimiser le truc à la manière de Zend\Config\Writer
faire :
[lang=php] $config = new Zend\Config\Config(array(), true); $config->production = array(); $config->production->webhost = 'www.example.com'; $config->production->database = array(); $config->production->database->params = array(); $config->production->database->params->host = 'localhost';
Est plus simple que de faire :
[lang=php] $dom = new \DomDocument("1.0", "UTF-8"); $document = $dom->createElementNS('http://www.w3.org/2001/XMLSchema-instance', 'Document'); $dom->appendChild($document); $docHeader = $dom ->createElement('Header'); $document ->appendChild($docHeader); $docHeader ->setAttribute('blabla1', ''); $docHeader ->setAttribute('blabla2', ''); $testDate = $dom ->createElement('TestDate'); $docHeader ->appendChild($testDate); //etc....
Dans le principe Zend\Config\Writer est génial, mais il ne gère pas les setAttribute et il n'a l'air prévu que pour générer des configurations, il ne peut pas être détourné si ?
Le but surtout c'est de faire un code propre épuré et maintenable... j'en demande beaucoup je sais lol.
Apres faire des boucles pour générer les mêmes ligne ce sera au final qu'une petite partie.
Edit : Bien joué pour ton 200ème message au fait flobrflo
Dernière modification par JGreco (07-05-2014 10:41:37)
Hors ligne
Oh merci, j'avais pas fait gaf. ^^
Non tu pourra pas adapter Config\Writter facilement. Il reconnait que certains mots clef =x
après tu peu peu être tenter une construction par tableau:
[lang=php] $xml = array(); $xml['Header'] = array('blabla1','blabla2'); $xml['TestDate']['value_date']; ...
puis rajouter une petite fonction récursive pour construire ton xml à parti d'un grand tableau comme celui ci.
Dernière modification par flobrflo (07-05-2014 11:16:29)
Hors ligne
Les tableaux ! Option intéressante ! Il existe plein de chose sur le net pour faire cela je pense :
https://code.google.com/p/array-to-domdocument/
Que ceci peut être une bonne option...
Mes recherches ont aussi porté sur ce post là :
http://www.devexp.eu/2009/04/11/php-dom … ay-to-xml/
Mais ce post étant vieux je suis sceptique surtout qu'il ne gère pas les attributs.
Bref solution intéressante je vais creuser un peu, si j'ai des questions, problèmes etc.. je reviendrais sur ce post.
Merci pour ton partage
Hors ligne
Wé je pense que c'est ce qu'il y a de plus adapté à ta demande. ^^
Par contre si tu trouve une lib qui fait comme config\writer un de ces jours.. hésite pas à poster =d
Hors ligne
Ce serait trop bien en effet ! Approche full objet etc... ce serait bien que dans le Zf3 il y pense quand même :p d'améliorer Zend\Config\Writer pour générer des xml tout court.
Hors ligne
bah rien de t'empêche de faire un module pour X_X
Hors ligne
On va attendre que je progresse alors y a du boulot lol !!!
Hors ligne
^^
Je regardais un peu pour rigoler. A mon avis c'est pas vraiment possible.
Faudrait surcharger l'accesseur -> donc créer une extension php. (et ce même si tu voulais mettre un autre signe à la place)
et même avec une fonction, tu ne peu pas faire un truc du style:
$xml->an(header)->an(title)->an(ok);
Donc.. à part les tableaux je vois pas
Hors ligne
Il y a aussi SimpleXML avec SimpleXMLElement.
Pour ton utilisation, il sera peut-être plus performant que DomDocument.
Hors ligne
J'avais vérifié avec SimpleXML quand je voulais fair un foreach sur lines possédant plusieurs line il refusait car il ne pouvais pas dupliquer dans ce sous element le même nom d'element.
J'avais peut être mal fait mon affaire. Mais je crois depuis que ce n'est pas ce que je veux. Si jamais tu y arrive avec SimpleXML cela m'intérrèsse :p
Merci pour vos retours en tous cas !!
Hors ligne
Bah pour SimpleXML il faut que tu fasse ton tableau avant, bien comme il faut, puis que tu génère le xml à la fin.
Hors ligne
Effectivement, avec :
[lang=php]<?php $xml = new SimpleXMLElement("<lines></lines>"); $xml->line = "Ca marche ?"; $xml->line = "Ca marche ?"; echo $xml->asXML();
Ça fonctionne mais on a un seul élément <line> dans le rendu XML.
ALors, par réflexe, je me suis demandé si la notation en tableau fonctionnerai :
[lang=php]<?php $xml = new SimpleXMLElement("<lines></lines>"); $xml->line[0] = "Ca marche ?"; $xml->line[1] = "Ca marche ?"; echo $xml->asXML();
Et ça fonctionne :
[lang=xml]<?xml version="1.0"?> <lines> <line>Ca marche ?</line> <line>Ca marche ?</line> </lines>
Et encore mieux, tu peux chainer :
[lang=php]<?php $xml = new SimpleXMLElement("<lines></lines>"); for ($i = 0; $i < 10; $i++) { $xml->line[$i] = "Ca marche ?"; } $xml->test->testEncore->encore = "Là aussi"; echo $xml->asXML();
Rendu :
[lang=xml]<?xml version="1.0"?> <lines> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <line>Ca marche ?</line> <test> <testEncore> <encore>Là aussi</encore> </testEncore> </test> </lines>
Pas mal hein.
C'est ce que tu veux non ?
Dernière modification par Blount (07-05-2014 16:51:40)
Hors ligne
Ah wé, pas mal le dernier exemple, j'étais pas encore tombé dessus..
EDIT : Parcontre si tu veux un encore2 dans testEncore c'est pas possible si?
EDIT 2 : en passant un tableau après ->testEncore par exemple ^^
Dernière modification par flobrflo (07-05-2014 17:02:32)
Hors ligne
Pourquoi pas possible ?
[lang=php] $xml->test->testEncore->encore = "Là aussi"; $xml->test->testEncore2 = "un autre";
ou encore :
[lang=php] $xml->test->testEncore[0]->encore = "Là aussi"; $xml->test->testEncore[1] = "un autre";
Je pense qu'on peut tout faire.
Dernière modification par Blount (07-05-2014 17:08:18)
Hors ligne
Ah we oki, j'ai regardé en vitesse du coup j'avais manqué un détails xD
[lang=php] $xml->test[0]->testEncore->encore = "Là aussi"; $xml->test[0]->testEncore2 = "un autre"; $xml->test[1]->testEncore = "test 2";
Bon ok c'est plutot joli, à voir ce que ça vaut sur une grosse génération de xml.
J'espère que JGreco nous dira ce que ça vaut =d
Hors ligne
On peut aussi gérer les attributs via tableau associatif ;
[lang=php] <?php $xml = new SimpleXMLElement("<lines></lines>"); $xml->test->testEncore[0]->encore = "Là aussi"; $xml->test->testEncore[1] = "un autre"; $xml->test->testEncore[1]["test"] = "ok"; echo $xml->asXML();
[lang=xml] <?xml version="1.0"?> <lines> <test> <testEncore> <encore>Là aussi</encore> </testEncore> <testEncore test="ok">un autre</testEncore> </test> </lines>
Hors ligne
OUhaaaaaaaaa !!! J'aime bcp sur le papier c'est prometteur !!!
Je teste cela dès que possible et je vous fait un feedback complet :p
Merci à vous pour cela
Dernière modification par JGreco (07-05-2014 18:14:36)
Hors ligne