IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Obtenir un "beau" XML avec REXML ?


Sujet :

Ruby

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut Obtenir un "beau" XML avec REXML ?
    Bonjour/Bonsoir,

    Voila, ca fait un moment que je me tatte pour essayer de faire du xml avec ruby et donc pas plus tard qu'aujourd'hui j'ai commencer à m'y mettre. Naturelement (ou pas) j'ai commencer par essayer d'en écrire un, voici comment je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    require 'rexml/document'
    include REXML
     
     
    class Savexml
    	def initialize(filename, directory)
    		@filename = filename
    		@directory = directory
    		@doc = nil
    	end
     
    	def writexml( somethingtowrite, user ,userid)
     
     
     
    		@doc = Document.new()
    		@doc.add_element("bibliography", {"id" => userid})
    		@doc.root.add_element("biblioentry")
    		biblioentry = @doc.root.elements[1]
     
     
    			current_serie = -1
    			serie = nil
     
    			somethingtowrite.each { |c|
     
    				if current_serie != c[:id_serie]
     
    					current_serie = c[:id_serie]
    					serie = Element.new("serie")
    					serie.add_element("idserie")
    					serie.elements["idserie"].text = c[:id_serie]
     
    					serie.add_element("tome",{"id" => c[:id_tome]})
    					serie.elements["tome"].text = c[:status]
    					#serie.elements << tomes
    					biblioentry.elements << serie
     
     
     
    				else
    					last = serie.add_element("tome",{"id" => c[:id_tome]})
    					last.text = c[:status]
     
    				end
    			}
     
     
    	end
     
    	def printxml
    		puts @doc
    	end
     
    	def savexml
    		#@file = File.new(@filename,  "w+")
    		#@file.write(@doc)
     
     
    		@file = File.new(@filename,"w+")
    		@doc.write( @file)
    	end
     
    	def resetxml
     
    	end
     
    	def destroy
     
    	end
     
    	def close
    		@file.close()
    	end
     
    end
     
    somethingtowrite = [
    								{:id_serie => 1, :id_tome => 1 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 2 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 3 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 4 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 5 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 6 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 7 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 8 , :status => "inside"},
    								{:id_serie => 1, :id_tome => 9 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 1 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 2 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 3 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 4 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 5 , :status => "inside"},
    							#	{:id_serie => 2, :id_tome => 6 , :status => "inside"}, => tome 6 manquant
    								{:id_serie => 2, :id_tome => 7 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 8 , :status => "inside"},
    								{:id_serie => 2, :id_tome => 9 , :status => "inside"},
    					]
     
    myxml = Savexml.new("fabseven",".")
    myxml.writexml( somethingtowrite, "fabseven" ,7)
    myxml.printxml()
    myxml.savexml()
    myxml.close()

    Voila, j'ai mon fichier fabseven (sans extention) avec mon xml dedans maisssss....voici ce qui me dérange :
    - j'ai pas le fameux xml version = 1.0 , comment le rajouter au début ? nécessaire ou pas ?
    - Tout mon xml est en une ligne (la première de mon fichier fabseven) et donc il est illisible pour un humain normal.


    Voila donc pour le xml version c'est pas trop grave mais pour la lisibilité du xml ca me gène beaucoup plus, y aurait-il une méthode simple pour avoir un xml lisible ? (avec des sauts de ligne et indentations)

    Merci d'avance


    ps : histoire que ca soit plus clair voici mon fichier en ce moment et ce que je voudrais avoir :

    En ce moment :
    <bibliography id='7'><biblioentry><serie><idserie>1</idserie><tome id='1'>inside</tome><tome id='2'>inside</tome><tome id='3'>inside</tome><tome id='4'>inside</tome><tome id='5'>inside</tome><tome id='6'>inside</tome><tome id='7'>inside</tome><tome id='8'>inside</tome><tome id='9'>inside</tome></serie><serie><idserie>2</idserie><tome id='1'>inside</tome><tome id='2'>inside</tome><tome id='3'>inside</tome><tome id='4'>inside</tome><tome id='5'>inside</tome><tome id='7'>inside</tome><tome id='8'>inside</tome><tome id='9'>inside</tome></serie></biblioentry></bibliography>
    Ce que je voudrais avoir :

    <bibliography id='7'>
    <biblioentry>
    <serie>
    <idserie>1</idserie>
    <tome id='1'>inside</tome>
    <tome id='2'>inside</tome>
    <tome id='3'>inside</tome>
    <tome id='4'>inside</tome>
    <tome id='5'>inside</tome>
    <tome id='6'>inside</tome>
    <tome id='7'>inside</tome>
    <tome id='8'>inside</tome>
    <tome id='9'>inside</tome>
    </serie>
    <serie>
    <idserie>2</idserie>
    <tome id='1'>inside</tome>
    <tome id='2'>inside</tome>
    <tome id='3'>inside</tome>
    <tome id='4'>inside</tome>
    <tome id='5'>inside</tome>
    <tome id='7'>inside</tome>
    <tome id='8'>inside</tome>
    <tome id='9'>inside</tome>
    </serie>
    </biblioentry>
    </bibliography>
    Dans les deux cas on voit que la personne d'id 7 possède plusieurs volumes de deux séries différente mais je pense que vous voyez bien que le second exemple est bien plus lisible

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    pour ajouter le prologue XML et obtenir du "pretty xml", voir la doc.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 30
    Points : 43
    Points
    43
    Par défaut
    Je te recommande de regarder la gem builder que je trouve plus simple à utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    require 'rubygems'
      require_gem 'builder'
     
      builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
      builder.person do |b|
        b.name("Jim")
        b.phone("555-1234")
      end
     
      #
      # Prints:
      # <person>
      #   <name>Jim</name>
      #   <phone>555-1234</phone>
      # </person>
    Thibaut
    --
    Mon blog pour programmeurs
    Mon blog sur le mind-mapping, le développement personnel et les softs utiles

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo