(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.
Document di REXML:
>> require 'rexml/document' => truePoi creiamo un oggetto
Document:
>> doc=REXML::Document.new => #<REXML::Document:22522284Ora 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_indentazioneAd 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.