Newsgroup: it.comp.lang.perl
Titolo: salvare informazioni in un file xml

avrei fatto un piccolo script per gestire una mia piccola videoteca, e
utilizzo come struttura in memoria un array di hash, che vorrei salvare su
(e, al riavvio dello script, vorrei popolare prendendo i dati da) un file
.xml
potreste suggerirmi una buona libreria da utilizzare? (se mi fate anche un
esempio minimale ve ne sarei molto grato)
le chiavi dell' hash sono 'nome', 'tipo', 'dischi', 'presente',
'possessore', l' xml finale sarebbe una cosa del genere:
<?xml version = "1.0"?>
<!DOCTYPE database SYSTEM "database.dtd">
<database>
 <film>
  <nome tipo="dvd" numero="1">eXistenZ</nome>
  <flag presente="S" />
 </film>
 <film>
  <nome tipo="vct" numero="1">Ghost in the shell</nome>
  <flag presente="N" />
  <possessore>Tonio</possessore>
 </film>
 .
 .
 .
</database>
-- 
McFly, c'e' nessuno in casa?
		-- "Ritorno al Futuro - II"



Ti consiglio di utilizzare un motore di database. Questo potrebbe esserti utile
per scalare, nel momento in cui i record dovessero aumentare (altrimenti li
caricheresti sempre tutti in memoria??!!!).
Inoltre avresti l'SQL che ti consentirebbe una maggior flessibilità nel
trattamento dei dati. 
Se non hai già a disposizione un motore SLQ di terze parti, il modulo
DBD::SQLite potrebbe fare al caso tuo visto che ha integrato l'engine RDBMS
SQLite.
by
	- Enrico
--- have fun with 
www.perl.it
 ---

 esempio minimale ve ne sarei molto grato)
Esempio (da perldoc XML::DOM)
     use XML::DOM;
     my $parser = new XML::DOM::Parser;
     my $doc = $parser->parsefile ("file.xml");
     # print all HREF attributes of all CODEBASE elements
     my $nodes = $doc->getElementsByTagName ("CODEBASE");
     my $n = $nodes->getLength;
     for (my $i = 0; $i < $n; $i++)
     {
         my $node = $nodes->item ($i);
         my $href = $node->getAttributeNode ("HREF");
         print $href->getValue . "\n";
     }
     # Print doc file
     $doc->printToFile ("out.xml");
     # Print to string
     print $doc->toString;
     # Avoid memory leaks - cleanup circular references for garbage
collection
     $doc->dispose;
Ti permettere di leggere il file XML, manipolarne il DOM e riscriverlo su
disco (supporta solo DOM level 1).
Oppure XML::LibXML, più efficente e completa che insieme a XML::XSLT ti
permette di fare cose molto carine...
Io per un mio lavoro ero partito con XML::DOM, ma poi adesso sto pensando di
fare il porting alla XML::LibXML (dove è disponibile anche un buon supporto
di Xpath se ti interessa).
Ciao.
--Gabriele
P.S. Cmq come ti dicevano gli altri sul NG, dipende da qual'è lo scopo: se è
un "esercizio" su XML, forse la soluzione è OK, ma se poi lo devi adattare a
grandi volumi di dati... forse conviene partire con un DBMS a supporto.

esempio minimale ve ne sarei molto grato)
Se non sei obbligato da altre considerazioni ad usare il formato xml,
considera anche YAML, che per la sola serializzazione di dati è forse
preferibile (e, in ogni caso, a me sta più simpatico). E` anche più agevole
da editare a mano.
E se i dati sono ben strutturati (e non ti serve quindi la flessibilità di
un formato libero come XML o YAML), o prevedi di trattare più di un migliaio
di titoli, il suggerimento di ricorre ad un database è sicuramente saggio.
Da questo potrai poi eventualmente ottenere con grande efficienza, se ti
serve, un documento XML o un report in qualsiasi formato tu voglia.
Ciao.

 potreste suggerirmi una buona libreria da utilizzare?
Per la scrittura, XML::Generator, per il parsing XML::DOM. Li trovi,
ovviamente, su CPAN, con la relativa documentazione.
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)       [ 
http://digilander.libero.it/ebassi/blog
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

 ovviamente, su CPAN, con la relativa documentazione.
mmm
ottimi, conosco qualcosina del dom dal js. Solo non sapevo come generare
l' xml in modo facile.
grazie, a te e a tutti gli altri che han risposto. Per quanto riguarda il
fatto che non sia il massimo caricare tutto in memoria, non ci sono molti
problemi... il mio "gigantesco" database probabilmente non andra' oltre i
50 film ^^;
in realta' era piu' che altro un modo per passare il tempo.
-- 
Non credo che l'analisi mi possa aiutare.  Mi ci vorrebbe una lobotomia.
		-- Woody Allen

Se vuoi "giocare" con l'XML per la gloria va bene (ma ti complichi la
vita).
Altrimenti ti consiglio l'ottimo (e leggero)
CSV.pm
 - a module providing manipulation routines for comma separated
   value (CSV) records
http://rath.ca/Misc/Perl_CSV/index.shtml
 Raffaello

   value (CSV) records
E` senz'altro più semplice di XML o YAML, ma non consente di registrare dati
complessi o strutturati.
Ciao.

 complessi o strutturati.
Fondamentalmente si'. Ma puo' essere usato come "mattone" per
construire uno script piu' articolato per gestire
appunto dati complessi o strutturati. Mi pare che il problema iniziale
riguardasse qualcosa come 50 registrazioni ... quindi la dimensione del
problema e' alquanto ridotta.
 Raffaello