Perl gestione xml

Per la gestione dei file xml esistono diversi moduli su CPAN .

Avevo trovato un paio di articoli in cui veniva spiegato l'utilizzo di XML::Simple ed ho incominciato a provarlo.

Questa libreria è pensata per l'utilizzo di semplici file xml, ma semplici semplici, cioè tag senza l'utilizzo misto di attributi o elementi (o l'uno o l'altro) e senza la ripetizione di elementi figli con lo stesso valore.

In pratica non capisco per cosa possa essere utilizzato :)

Inoltre se si legge un file xml, lo modifichiamo e lo salviamo non viene mantenuta la sequenza degli elementi, quindi se dovete validare il file con uno schema XSD la validazione fallirebbe! Senza parlare dei problemi per capire se viene ritornato un array o un referimento all'array, da diventarci matti!!

Devo ringraziare Giancarlo che mi ha proposto di utilizzare XML::Smart : un modulo scritto veramente da uno che sa i problemi che si incontrano nella gestione di file xml!!

La miglior libreria per xml che abbia mai visto, considerando anche quelle che ho utilizzato in Java (comunque ottime come XMLBeans) e PHP (SimpleXML ha problemi con xml complessi e DOMXML è complessa e poco flessibile).

In pratica l'autore si è scritto prima il modulo Object::MultitType per la gestione trasparente di array, hash, scalari, code e glob senza preoccuparsi del tipo, ma l'oggetto corrente ritorna il valore più corretto, ad esempio:

%hash = (
key => ['a','b']
) ;

$hash->{key} ## return $hash{key}[0]
$hash->{key}[0] ## return $hash{key}[0]
$hash->{key}[1] ## return $hash{key}[1]
$hash->{key}[2] ## return undef


In questo modo non è necessario fare il Dumper della variabile per controllarna la struttura ed il tipo o utilizzare la funzione ref!!

Grazie a questo modulo XML::Smart permette la gestione dell'hash in cui viene caricato l'xml semplicissimo, ecco l'esempi proposti nel sito cpan:


## Create the object and load the file:
my $XML = XML::Smart->new('file.xml') ;

## Force the use of the parser 'XML::Smart::Parser' di default utilizza XML::Parser, quello di smart è leggermente più semplice
my $XML = XML::Smart->new('file.xml' , 'XML::Smart::Parser') ;

## Get from the web:
my $XML = XML::Smart->new('http://www.perlmonks.org/index.pl?node_id=16046') ;

## Cut the root elimina dall'albero l'elemento root
$XML = $XML->cut_root ;

## Or change the root:
$XML = $XML->{hosts} ;

## Get the address [0] of server [0]:
my $srv0_addr0 = $XML->{server}[0]{address}[0] ;
## ...or...
my $srv0_addr0 = $XML->{server}{address} ;

## Get the server where the attibute 'type' eq 'suse': Funzionalità simile ad Xpath
my $server = $XML->{server}('type','eq','suse') ;

## Get the address again:
my $addr1 = $server->{address}[1] ;
## ...or...
my $addr1 = $XML->{server}('type','eq','suse'){address}[1] ;

## Get all the addresses of a server:
my @addrs = @{$XML->{server}{address}} ;
## ...or...
my @addrs = $XML->{server}{address}('@') ;

## Get a list of types of all the servers:
my @types = $XML->{server}('[@]','type') ;

## Add a new server node:
my $newsrv = {
os => 'Linux' ,
type => 'Mandrake' ,
version => 8.9 ,
address => [qw(192.168.3.201 192.168.3.202)]
} ;

push(@{$XML->{server}} , $newsrv) ;

## Get/rebuild the XML data:
my $xmldata = $XML->data ;

## Save in some file:
$XML->save('newfile.xml') ;


Inoltre c'è la gestione dei tag meta, dell'entità e altro ancora.

La documentazione è fatta benissimo, in più c'è un tutorial e le faq.

Commenti