Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1609 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2214310
Sethenssen
Posté le 22-12-2013 à 12:41:13  profilanswer
 

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
mood
Publicité
Posté le 22-12-2013 à 12:41:13  profilanswer
 

n°2214312
gilou
Modérateur
Modzilla
Posté le 22-12-2013 à 15:00:44  profilanswer
 

: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é!  --
n°2214313
gilou
Modérateur
Modzilla
Posté le 22-12-2013 à 15:06:51  profilanswer
 

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é!  --
n°2214315
Sethenssen
Posté le 22-12-2013 à 15:33:30  profilanswer
 

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 :)

n°2214376
gilou
Modérateur
Modzilla
Posté le 23-12-2013 à 19:38:03  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

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

 

Sujets relatifs
split + perlperl tk getOpenFile
[PERL] Probleme avec module Chart::Gnuplotperl + TK
[Perl] CGI qui parse le STDIN n'importe commentperl + xml
[Perl] Utilisation correcte de timeout_callFusionner plusieurs fichiers XML avec la même structure
Préprod/Prod, cpan, activestate, intégration librairies[perl] process defunct avec fork et exec
Plus de sujets relatifs à : [Résolu][Perl] XML::DOM Comment avoir une belle indentation?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR