Generare XML con DOM

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


(da php cookbok 12.3)

REXML, la libreria standard per la gestione dell’XML in ruby mette a disposizione dell’utente molte API diferenti: DOM,SAX,SAX2,PULL, piu’ le sue api caratteristiche.

DOM e’ una api molto comune e diffusa, ma REXML se ne discosta leggermente, nel tentativo di rendere la vita piu’ semplice allo sviluppatore. Ad esempio, per aggiungere un elemento ad un documento, usando DOM dovremmo scrivere:
   element = document.createElement("pippo")
   current_element.appendChild(element)

mentre con @REXML@ bastera' scrivere:

   current_element.add_element("pippo")

Ma andiamo per gradi. Anzitutto creiamo un oggetto REXML::Document, poi lo manipoleremo aggiungendo dati ed infine ne effettueremo il dump su una stringa. A quel punto sara’ banale stampare la stringa su un file.

Anzitutto carichiamo il modulo Document di REXML:
 >> require 'rexml/document'
 => true
Poi creiamo un oggetto Document:
 >> doc=REXML::Document.new
 => #<REXML::Document:22522284
Ora aggiungiamo un elemento radice:
 >> book=doc.add_element 'book'
 => #<REXML::Element:0x2ae65e0 @name="book", @elements=#<REXML::Elements:0x2ae64
 0 @element=#<REXML::Element:0x2ae65e0 ...>>, @namespace="", @context={}, @paren
 =#<REXML::Document:22495716, @expanded_name="book", @prefix="", @attributes={},
 @children=[]>
attenzione, il metodo inspect() degli oggetti di REXML da un output molto esteso, quindi ora lo eviteremo, lasciando solo il codice Ora aggiungiamo un titolo, settiamo un paio di atributi, ed inseriamo del testo:
 title=book.add_element 'title'
 title.text= 'la mia paginetta del wiki'
 title.attributes['cover']='soft'
Per vedere l’xml vi bastera’ trasformare il documento (o gli elementi) in stringa:
 >> doc.to_s
 => "<book><title cover='soft'>la mia 
paginetta del wiki</title></book>
Volendo possiamo unire la creazione di elementi con l’aggiunta di attributi, usando un Hash:
 (book.add_element 'title', {'cover'=>'soft','isbn'=>'0123456789'}).to_s
 "<title isbn='0123456789' cover='soft'/>" 
Creiamo ed aggiungiamo un paio di autori al libro:
 aut=book.add_element 'author'
 aut.text='gabriele'
 aut2=book.add_element 'author'
 aut2.text='nicola'
Se volete stampare su un file usando una comoda indentazione, bastera’ scrivere:
 doc.write un_output,livello_indentazione
Ad esempio:
  doc.write STDOUT, 2

  <book>
    <title cover='soft'>la mia paginetta del wiki</title>
    <author>gabriele</author>
    <author>nicola</author>
  </book>

Note: Un pezzo di un documento XML e’ detto nodo. Esistono molti tipi di nodi in un documento XML,ma generalmente ci si preoccupa di nodi testo, attributi ed elementi.

Ovviamente potreste, se lo desiderate, seguire un approccio uniforme alla creazione di un doicumento xml: crare oggetti Element, Text, Attribute ed aggiungere man mano gli uni agli altri. Ma ovviamente questo e’ un lavoro ripetitivo e lungo. Dato che un nodo di tipo testo e’ poco piu’ di una stringa, e’ molto piu’ comodo scrivere direttamente mio_elemento.text = ‘miotesto’

E dato che gli attributi sono coppie nome/valore, e’ possibile usare un Hash per passarli al costruttore di un elemento.

REXML segue l’approccio di ruby: rendere le cose semplici.

Updated on November 25, 2005 15:19 by Ruby Fan (151.37.134.237)