probleme XML avec PHP DOMXML

probleme XML avec PHP DOMXML - XML/XSL - Programmation

Marsh Posté le 26-05-2005 à 15:11:16    

mon programme génère une page xml visiblement erronnée... pourquoi ?
 
http://www.clonecopy.net/php/ezdocs/essai.xml
 
quelqu'un connait l'extension DOMXML de PHP ?
j'arrive pas à imbriquer mes balises correctement... elles se forment toutes sous la forme  
<balise1 attribut="123"/>
<balise2 attribut="123"/>
 
 au lieu de  
 
<balise1 attribut="123">
</balise>
<balise2 attribut="123">
</balise>
 
resultat... le DOM inspector de firefox les voit toutes imbriquées les unes dans les autres :
 
document
    |____balise1
            |____balise2
 
au lieu de  
 
document
    |___balise1
    |___balise2
 
comment je peux faire ?
       

Reply

Marsh Posté le 26-05-2005 à 15:11:16   

Reply

Marsh Posté le 26-05-2005 à 15:24:04    

autant que je sache, tes 2 ecritures sont equivalentes.
 
pour les voir imbriquees selon le premier schema, ca veut dire que ton document est comme ca:
 
<balise1 attribut="123">
    <balise2 attribut="123">
    </balise>
</balise>
 
ca veut dire aussi qu'il comprend de maniere implicite l'ordre des end-tags, puisque tu precise pas le numero.
 
a part ca, je vois pas ou est le probleme, desole!

Reply

Marsh Posté le 26-05-2005 à 15:26:49    

bah le probleme c'est que je veux pas que mes balises soient imbriquées comme ça :
<document>
<balise1 attribut="123">texte1  
    <balise2 attribut="123">texte2
    </balise2>  
</balise1>  
</document>
 
 
je veux qu'elles soient comme ça :
<document>
<balise1 attribut="123">texte1</balise1>  
<balise2 attribut="123">texte2</balise2>
</document>


Message édité par freed102 le 26-05-2005 à 15:28:25
Reply

Marsh Posté le 26-05-2005 à 15:39:36    

bah oui, on est d'accord.
 
c'est pour toi ou c'est pour un projet?
 
tu peux pas passer a php5? paske il gere le xml les doigt dans le zen...
 
je connais pas domxml, j'utilise que php5.
 
t'as pas une fonction equivalente a appendChild (rattacher fils en francais)?

Reply

Marsh Posté le 26-05-2005 à 15:44:05    

non mon serveur est en PHP4, l'herbergeur a bien voulu installer l'extension DOMXML c deja bien ! lol
 
à priori j'ai toutes les fonctions necessaires pour construire mon fichier.. Mais peut etre que je m'y prends mal... Voici un bout de code :
 

Code :
  1. function CreateDOMTextElement($DOMdocument,$parentNodeName,$newNodename,$couleur,$size,$text)
  2. {
  3. $node=$DOMdocument->get_elements_by_tagname($parentNodeName);
  4. $newNode=$DOMdocument->create_element($newNodename);
  5. $childnode=$DOMdocument->append_child($newNode);
  6. $childnode->set_attribute("couleur",$couleur);
  7. $childnode->set_attribute("size",$size);
  8. $childnode=$DOMdocument->append_child($DOMdocument->create_text_node($text));
  9. }
  10. $dom=domxml_new_doc("1.0" );
  11. $firstchildName="document";
  12. $firstchild = $dom->create_element($firstchildName);
  13. $document = $dom->append_child($firstchild);
  14. $document->set_attribute("pagewidth","210" );
  15. $document->set_attribute("pageheight","297" );
  16. $document->set_attribute("background","#FFFFFF" );
  17. CreateDOMTextElement($dom,$firstchildName,"nom","#CCCCCC","12",$_SESSION['CVnom']);
  18. CreateDOMTextElement($dom,$firstchildName,"prenom","#CCCCCC","12",$_SESSION['CVprenom']);
  19. CreateDOMTextElement($dom,$firstchildName,"titre","#CCCCCC","12",$_SESSION['CVtitre']);
  20. CreateDOMTextElement($dom,$firstchildName,"adresse","#CCCCCC","16",$_SESSION['CVadresse']);
  21. CreateDOMTextElement($dom,$firstchildName,"cp","#CCCCCC","8",$_SESSION['CVcp']);
  22. CreateDOMTextElement($dom,$firstchildName,"ville","#CCCCCC","8",$_SESSION['CVville']);
  23. CreateDOMTextElement($dom,$firstchildName,"telephone","#CCCCCC","8",$_SESSION['CVtelephone']);
  24. CreateDOMTextElement($dom,$firstchildName,"fax","#CCCCCC","8",$_SESSION['CVfax']);
  25. CreateDOMTextElement($dom,$firstchildName,"mobile","#CCCCCC","8",$_SESSION['CVmobile']);
  26. CreateDOMTextElement($dom,$firstchildName,"email","#CCCCCC","8",$_SESSION['CVemail']);
  27. CreateDOMTextElement($dom,$firstchildName,"url","#CCCCCC","16",$_SESSION['CVurl']);
  28. //echo $dom->dump_mem(true, 'UTF-8' );
  29. $dom->dump_file('essai.xml');
  30. echo 'Export XML effectue !<br><a href="essai.xml">Voir le fichier</a>';

Reply

Marsh Posté le 26-05-2005 à 15:52:38    

en resumé...
j'ai créé une premiere balise "document" (firstchildName)
avec ma fonction "CreateDOMTextElement" j'ajoute mes elements un par un avec DOM->append_child(); au noeud (dont le nom est le second attribut de la fonction CreateDOMTextElement)  
 
... logiquement ça fait bien un  
 
<document>
<balise1>texte</balise1>
<balise2>texte</balise2>
<balise3>texte</balise3>
</document>
 
... mais c pas le cas !:(

Reply

Marsh Posté le 26-05-2005 à 16:04:07    

Pour un truc comme ça :

<document>
<balise1>texte</balise1>
<balise2>texte</balise2>
<balise3>texte</balise3>
</document>


Faut faire comme ça :

$xml_doc =& domxml_new_doc('1.0');
 
$root =& $xml_doc->create_element('document');
$xml_doc->append_child($root);
 
$balise1 =& $xml_doc->create_element('balise1');
$balise1->set_content('texte');
$root->append_child($balise1);
 
$balise2 =& $xml_doc->create_element('balise2');
$balise2->set_content('texte');
$root->append_child($balise2);
 
$balise3 =& $xml_doc->create_element('balise3');
$balise3->set_content('texte');
$root->append_child($balise3);
 
echo $xml_doc->dump_mem();

Reply

Marsh Posté le 26-05-2005 à 16:22:47    

ah !! ya du mieux !!  
 

Code :
  1. function CreateDOMTextElement($DOMdocument,$parentNodeName,$newNodename,$couleur,$size,$text)
  2. {
  3. $parentNode=& $DOMdocument->get_elements_by_tagname($parentNodeName);
  4. $newNode=& $DOMdocument->create_element($newNodename);
  5. $newNode->set_content($text);
  6. $newNode->set_attribute("couleur",$couleur);
  7. $newNode->set_attribute("size",$size);
  8. $parentNode=& $DOMdocument->append_child($newNode);
  9. }


 
mais à quoi sert le & ???
 
et avec set_content je peux refermer ma baliser </DOCUMENT> ?


Message édité par freed102 le 26-05-2005 à 16:27:17
Reply

Marsh Posté le 26-05-2005 à 16:33:09    

Y'a pas de balise document à refermer, tout ça est gérer par le create_element. Et le set_content revient à créer un textnode et à l'appender à un élément.
 
Pour le &, documente-toi sur PHP et les référence ;)

Reply

Marsh Posté le 26-05-2005 à 16:40:13    

bon j'ai toujours une erreur mais là je crois que c un probleme d'encodage ou je ne sais quoi...  
 

Citation :


La page XML ne peut pas être affichée  
Impossible d'afficher l'entrée XML en utilisant la feuille de style XSL. Corrigez l'erreur, puis cliquez sur le bouton Actualiser ou réessayez ultérieurement.  
 
 
--------------------------------------------------------------------------------
 
Un seul élément de niveau supérieur est autorisé dans un document XML. Erreur de traitement de la ressource http://www.clon...
 
<nom couleur="#CCCCCC" size="12">Dupond</nom>
-^


Reply

Marsh Posté le 26-05-2005 à 16:40:13   

Reply

Marsh Posté le 26-05-2005 à 16:49:45    

La structure d'un doc XML doit avoir cette tronche :

<pouet>
  <truc>
  <bidule>
    <machin />
  </bidule>
</pouet>


Donc tout dans un seul élément. T'as pas le droit d'avoir genre :

<pouet>
  <truc />
</pouet>
<bidule>
  <machin>
  </machin>
</bidule>

Reply

Marsh Posté le 26-05-2005 à 16:51:20    

oui c bien ce que j'ai compris.. c ma balise <document> qui n'est pas fermée qui fait iech !!! lol

Reply

Marsh Posté le 26-05-2005 à 16:55:47    

à mon avis c mon get_element_by_tag_name qui gene
il me retourne un array alors que je veux un object

Reply

Marsh Posté le 26-05-2005 à 16:56:32    

:heink: avec des fonctions DOMXML, c'est fait automatiquement, ça... Oublie pas de faire un append_child de ton élément document sur le document xml

Reply

Marsh Posté le 26-05-2005 à 16:58:50    

bah c ce que je fais....

Code :
  1. function CreateDOMTextElement($DOMdocument,$parentNodeName,$newNodename,$couleur,$size,$text)
  2. {
  3. $parentNode=$DOMdocument->get_elements_by_tagname($parentNodeName);
  4. $newNode=& $DOMdocument->create_element($newNodename);
  5. $newNode->set_attribute("couleur",$couleur);
  6. $newNode->set_attribute("size",$size);
  7. $newNode->set_content(htmlentities($text,ENT_QUOTES));
  8. $parentNode->append_child($newNode); //ligne 197
  9. }


 

Citation :


 
Fatal error: Call to a member function on a non-object in /u/clonecop/public_html/php/ezdocs/valid.php on line 197

Reply

Marsh Posté le 26-05-2005 à 17:02:41    

Sauf que get_elements_by_tagname renvoi un tableau d'éléments, donc c'est :

$parentNode[0]->append_child($newNode);

Reply

Marsh Posté le 26-05-2005 à 17:05:40    

yess c ça...  
mais c toujours erroné pour le doc !
 

Code :
  1. <?xml version="1.0"?>
  2. <document pagewidth="210" pageheight="297" background="#FFFFFF"/>
  3. <nom couleur="#CCCCCC" size="12">Dupond</nom>
  4. <prenom couleur="#CCCCCC" size="12">Jacques</prenom>
  5. <titre couleur="#CCCCCC" size="12">Plombier</titre>
  6. <adresse couleur="#CCCCCC" size="16">33, rue des beaux tuyaux</adresse>
  7. <cp couleur="#CCCCCC" size="8">78400</cp>
  8. <ville couleur="#CCCCCC" size="8">Plombcity</ville>
  9. <telephone couleur="#CCCCCC" size="8">0123456790</telephone>
  10. <fax couleur="#CCCCCC" size="8">0123456710</fax>
  11. <mobile couleur="#CCCCCC" size="8"></mobile>
  12. <email couleur="#CCCCCC" size="8">xxx@xxx.com</email>
  13. <url couleur="#CCCCCC" size="16">http://www.clonecopy.net</url>

Reply

Marsh Posté le 26-05-2005 à 17:11:03    

Là ça veut dire que les autres éléments ne sont pas ajoutés dans document (document est vide dans ton cas, cf. /> ), faut chercher ailleurs...

Reply

Marsh Posté le 26-05-2005 à 17:27:14    

question....
peut on passer un objet dans les attributs d'une fonction ??

Reply

Marsh Posté le 26-05-2005 à 17:33:43    

Ben ouais

Reply

Marsh Posté le 26-05-2005 à 17:41:23    

oh tiens !! d'un coup ça marche !!!! je sais pas pourquoi j'ai rien changé ! WERK !!!!! :bounce: :bounce: :jap: :jap: :jap:
 
http://www.clonecopy.net/php/ezdocs/essai.xml
 

Code :
  1. function CreateDOMTextElement($DOMdocument,$parentNodeName,$newNodename,$couleur,$size,$text)
  2. {
  3. $parentNode=& $DOMdocument->get_elements_by_tagname($parentNodeName);
  4. $newNode=& $DOMdocument->create_element($newNodename);
  5. $newNode->set_attribute("couleur",$couleur);
  6. $newNode->set_attribute("size",$size);
  7. $newNode->set_content(htmlentities($text,ENT_QUOTES));
  8. $parentNode[0]->append_child($newNode);
  9. }
  10. $dom=& domxml_new_doc("1.0" );
  11. $firstchildName="document";
  12. $firstchild =& $dom->create_element($firstchildName);
  13. $firstchild->set_attribute("pagewidth","210" );
  14. $firstchild->set_attribute("pageheight","297" );
  15. $firstchild->set_attribute("background","#FFFFFF" );
  16. $dom->append_child($firstchild);
  17. CreateDOMTextElement($dom,$firstchildName,"nom","#CCCCCC","12",$_SESSION['CVnom']);
  18. CreateDOMTextElement($dom,$firstchildName,"prenom","#CCCCCC","12",$_SESSION['CVprenom']);
  19. CreateDOMTextElement($dom,$firstchildName,"titre","#CCCCCC","12",$_SESSION['CVtitre']);
  20. CreateDOMTextElement($dom,$firstchildName,"adresse","#CCCCCC","16",$_SESSION['CVadresse']);
  21. CreateDOMTextElement($dom,$firstchildName,"cp","#CCCCCC","8",$_SESSION['CVcp']);
  22. CreateDOMTextElement($dom,$firstchildName,"ville","#CCCCCC","8",$_SESSION['CVville']);
  23. CreateDOMTextElement($dom,$firstchildName,"telephone","#CCCCCC","8",$_SESSION['CVtelephone']);
  24. CreateDOMTextElement($dom,$firstchildName,"fax","#CCCCCC","8",$_SESSION['CVfax']);
  25. CreateDOMTextElement($dom,$firstchildName,"mobile","#CCCCCC","8",$_SESSION['CVmobile']);
  26. CreateDOMTextElement($dom,$firstchildName,"email","#CCCCCC","8",$_SESSION['CVemail']);
  27. CreateDOMTextElement($dom,$firstchildName,"url","#CCCCCC","16",$_SESSION['CVurl']);
  28. echo $dom->dump_mem(true, 'UTF-8' );
  29. $dom->dump_file('essai.xml');
  30. echo 'Export XML effectue !<br><a href="essai.xml">Voir le fichier</a>';


Message édité par freed102 le 26-05-2005 à 17:43:37
Reply

Marsh Posté le 26-05-2005 à 17:46:21    

pratique les fonctions... j'avais pas envie de me taper toutes les lignes à la main ! (avec toutes les erreurs qui vont avec)
 
thanx a lot ! :jap:

Reply

Marsh Posté le 26-05-2005 à 23:53:06    

Great. Maintenant tu peux passer au XSL pour transformer ça en autre chose [:johneh]

Reply

Marsh Posté le 27-05-2005 à 00:13:01    

bah pas pour cette fois car là ça servait juste pour memoriser les parametres et informations destinées à la construction d'un fichier PDF (avec EZPDF, j'ai deja fait une sorte de moteur... Mais là je m'emmelais les crayons avec les variables... c pourquoi j'ai fait un systeme avec XML)
... je pense pas qu'un XSL soit necessaire... à moins que ce soit vraiment magique et qu'on peut transformer un XML+XSL en PDF super top graphique etc etc... mais j'en doute !


Message édité par freed102 le 27-05-2005 à 00:14:15
Reply

Marsh Posté le 27-05-2005 à 00:19:02    

Je crois qu'il y a un truc comme ça justement, je vais me renseigner :sol:

Reply

Marsh Posté le 27-05-2005 à 00:25:21    

http://www.netmag.co.uk/tutorials/ [...] tionid=183
 
Avec XSL-FO... A voir maintenant si c'est faisable via PHP...

Reply

Marsh Posté le 27-05-2005 à 00:38:15    

interessant... Mais est-ce que c'est capable de positionner les elements de façon precise avec des parametres ?

Reply

Marsh Posté le 27-05-2005 à 00:40:06    

ouai je vois le genre... mais je sens la galere avec les polices etc etc coté serveur ! avec ezpdf j'avais trouvé une solution plutot sympa pour les polices

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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