[Résolu][Perl] XML::DOM Comment avoir une belle indentation?

XML::DOM Comment avoir une belle indentation? [Résolu][Perl] - Perl - Programmation

Marsh Posté le 22-12-2013 à 12:41:13    

Bonjour,
 
Mon but est de créer un fichier XML de A à Z
Je n'ai que XML::DOM d'installé sur les serveurs.
 
Je vais donc partir d'un exemple que j'ai récupéré du Net mais le problème est que le résultat ne s'affiche que sur une seule ligne.
Comment faire pour avoir une belle indentation?
 
Voici le code:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Date::Format;
  5. use XML::DOM;
  6. my $time = time();
  7. my $ctime = time();
  8. my $year  = time2str("%Y",$time);
  9. my $month = time2str("%m",$time);
  10. my $day   = time2str("%d",$time);
  11. # create an XML::DOM::Document object
  12. my $doc = XML::DOM::Document->new();
  13. # create the root element of the document
  14. my $root = $doc->createElement('date');
  15. # To create a simple element:
  16. #   1.  create the element node and set attribute
  17. #   2.  create the text node
  18. #   3.  append the text node to the element node
  19. #   4.  append the element just created to its parent
  20. #   1.  create the element node and set attribute
  21. my $year_elem = $doc->createElement('year');
  22. $year_elem->setAttribute('ctime',$ctime);
  23. #   2.  create the text node
  24. my $year_text = $doc->createTextNode($year);
  25. #   3.  append the text node to the element node
  26. $year_elem->appendChild($year_text);
  27. #   4.  append the element just created to its parent
  28. $root->appendChild($year_elem);
  29. # now do the month, and day
  30. my $month_elem = $doc->createElement('month');
  31. $month_elem->appendChild($doc->createTextNode($month));
  32. $root->appendChild($month_elem);
  33. my $day_elem = $doc->createElement('day');
  34. $day_elem->appendChild($doc->createTextNode($day));
  35. $root->appendChild($day_elem);
  36. open(TOP, ">", "/data/scripts/bou.xml" );
  37. print $root->toString(), "\n";
  38. print TOP $root->toString(), "\n";
  39. close(TOP);
  40. __END__


Message édité par Sethenssen le 22-12-2013 à 15:34:14
Reply

Marsh Posté le 22-12-2013 à 12:41:13   

Reply

Marsh Posté le 22-12-2013 à 15:00:44    

:hello: Bonjour,
 
Il va te falloir utiliser un module un peu plus complet, heureusement, il n'y a presque pas de code à changer.
Si tu remplaces XML::DOM par XML::LibXML dans ton code:

use XML::DOM; --> use XML::LibXML;
...
my $doc = XML::DOM::Document->new();  -->  my $doc = XML::LibXML::Document->new();


ça fait la même chose que ton code actuel, sauf que avec XML::LibXML, la méthode toString() a un fonctionnement variable en fonction du paramètre que tu lui passe, et si tu fais en plus la modification suivante pour lui passer une valeur de 1 comme paramètre:

print $root->toString(), "\n"; --> print $root->toString(1), "\n";
print TOP $root->toString(), "\n";   --> print TOP $root->toString(1), "\n";


tu vas avoir la mise en ligne et l'indentation, c'est magique... :D  
Et tu peux même faire appel à XML::LibXML::PrettyPrint si tu veux contrôler finement l'indentation.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-12-2013 à 15:06:51    

Note: Si tu n'as pas la possibilité d'utiliser XML::LibXML, c'est assez mort, XML::DOM n'est pas prévu pour cela, la seule possibilité pratique (a part tout réécrire en gérant un parcours récursif de ton arbre DOM, ce qui est la réinvention de la roue et est relativement lourd) est d'écrire dans une variable le fichier xml puis de reparser avec un module qui permette de faire du pretty print (il serait surprenant que tu n'aies pas XML::Tidy d'installé par exemple).
A+,


Message édité par gilou le 22-12-2013 à 15:10:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-12-2013 à 15:33:30    

Merci Gilou,
Je vais enquiquiner mes admins sys pour qu'ils m'installent XML::LibXML
Réinventer la roue n'est effectivement pas prévu au programme :)

Reply

Marsh Posté le 23-12-2013 à 19:38:03    

Oui, surtout que tu as déjà des modules pas si courants sur ton serveur: Date::Format est pas dans la liste des modules pré-compilés de ActivePerl par exemple.
Donc tes admins doivent savoir gérer cela.
A+,


Message édité par gilou le 23-12-2013 à 19:38:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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