Newsgroup: it.comp.lang.perl
Titolo: XML::Simple

# Questo è il file data.xml:
<replies>
  <reply number="0">
    <user>Larry</user>
    <text>Hi!</text>
  </reply>
  <reply number="1">
    <user>Niki</user>
    <text>Morning!</text>
  </reply>
  <reply number="2">
    <user>Joe</user>
    <text>Night!</text>
  </reply>
</replies>
# per leggere il file data.xml uso questo codice:
use XML::Simple;
my $simple = XML::Simple->new( );
my $tree = $simple->XMLin( './data.xml' );
print $tree->{ reply }->{ user }[0]; # stampa: Larry...giusto?
come faccio a stampare tutti i <reply>? credo cmq con un ciclo...ma non 
so come...
come faccio ad aggiungere alla struttura i nuovi dati e poi ad 
aggiornare il file:
<reply number="3">
    <user>Paul</user>
    <text>How are you?</text>
</reply>
lo posso fare con XML::Simple? il file lo aggiorna il modulo o devo 
farlo io?
 e se avessi voluto modificare i valori di <reply number="2">?
Grazie...

farlo io?
Il modulo XML::Simple provvede un'interfaccia molto semplice (ma va!)
e funzionalità abbastanza limitate, che vanno bene per compiti
semplici su documenti non eccessivamente grossi e complessi.
Per esigenze più complesse ci sono moduli XML:: più completi (e più
difficili da usare). Sta ovviamente a te stabilire se per le tue
esigenze è sufficiente XML::Simple o ti è necessario uno strumento più
sofisticato.
E` comunque possibile scrivere documenti xml anche con il modulo
XML::Simple, attraverso il metodo XMLout:
        print simple->XMLout($tree);
Per modificare la struttura dati, basta modificare l'hash riferito da
$tree:
	$tree->{reply}->[0]->{user} = 'Giovanni';
	print $simple->XMLout($tree);
 
Ci sono poi parametri e opzioni che consentono qualche controllo su
come viene interpretata e restituita la struttura.
In particolare, può convenire utilizzare l'opzione ForceArray => 1:
	use XML::Simple;
	my $simple = XML::Simple->new( );
	my $tree = $simple->XMLin( './dati.xml', ForceArray => 1);
Con il che, il ciclo di stampa diventa:
	for my $reply (@{$tree->{reply}}) {
		print $reply->{user}->[0], "\n";
	}
E la modifica:
	$tree->{reply}->[0]->{user}->[0] = 'Giovanni';
	print $simple->XMLout($tree);
Ciao.

Posso usarlo con file grossi? il mio server non mi permette di 
installare moduli...posso mettere il modulo XML::Simple nella mia 
cgi-bin e poi magari fare una require?

cgi-bin e poi magari fare una require?
Per quello che capisco, la risposta ad entrambe le domande è: sì, con le
dovute precauzioni.
Il problema con file grossi è quanta memoria e quanto tempo consumano. Non
mi è chiaro che cosa succeda in dettaglio, ma XML::Simple non è di per sé
un parser XML, ma solo un'interfaccia semplificata ad alcuni parser
(XML::SAX, XML::Parser o altri). Quindi direi che dipende da quale parser
si sceglie di usare. Rimando alla documentazione di XML::Simple per
maggiori dettagli.
A sua volta, dovrebbe essere possibile utilizzare un'installazione utente
di XML::Simple, purché si provvedano anche tutti i moduli di cui fa uso,
almeno finché si tratta di moduli in perl puro. Se contengono anche codice
binario, aggiustare le cose perché tutto funzioni può essere più
complicato. In ogni caso, non saprei dare i dettagli. Prima di fasciarsi la
testa, comunque, conviene controllare se sul server non ci sia già tutto:
mi sembra ragionevole aspettarsi che qualche modulo per la gestione di
documenti XML ci sia.
Ciao.

 Ciao.
Sono riuscito ad usare il modulo tramite:
use lib '.';
e la lettura va benissimo...però poi ho usato il tuo codice per 
modificare un dato (larry) ma non funziona...come faccio a fare 
riferimento a larry?...

riferimento a larry?...
Con l'esempio di documento data.xml che hai dato, da me questo
funziona:
        use XML::Simple;
        my $simple = XML::Simple->new( );
        my $tree = $simple->XMLin( './data.xml', ForceArray => 1);
        $tree->{reply}->[0]->{user}->[0] = 'Giovanni';
        print $simple->XMLout($tree, RootName => 'replies');
produce:
        <replies>
          <reply number="0">
            <text>Hi!</text>
            <user>Giovanni</user>
          </reply>
          <reply number="1">
            <text>Morning!</text>
            <user>Niki</user>
          </reply>
          <reply number="2">
            <text>Night!</text>
            <user>Joe</user>
          </reply>
        </replies>
Ciao.

 wrote:

immagino che per modificare "joe" dovrei fare:
$tree->{reply}->[2]->{user}->[0] = 'Joe jr';
giusto?

giusto?
Sì (ma non era più semplice provare?). L'indice 2 di $tree->{reply} non ha
naturalmente nulla a che fare con l'attributo "number": sta ad indicare il
terzo elemento dell'insieme dei reply (che perl traduce in un array), la
coincidenza con l'attributo "number" è del tutto casuale (l'osservazione è
ovvia, ma ripetere le cose ovvie è appunto una delle mie principali
abilità).
Ciao.

 giusto?
Non so se funzioni anche in ambiente web, ma per vedere bene come è
strutturato un reference, puoi usare il modulo Data::Dumper, che
serve appositamente per stampare a video la struttura.
Al massimo puoi fare uno script da far girare localmente e in un secondo
momento passarlo sul server...
My 2 cents,
-- 
+--------+ | ASCII ribbon campaign ( ) | 
www.autistici.org/kral
|  kral  | |  - against HTML email  X  |
+--------+ |              & vCards / \ | my gpg id = 0x7C946947

purtroppo non funziona...non riesce a modificare il file...

purtroppo non funziona...non riesce a modificare il file...
Ma infatti non modifica il file (se è questo il punto, anche se mi sembrava
di averlo già chiarito): modifica la struttura in memoria (o, forse, anche
in cache sul disco, non ho ancora ben chiaro). Per modificare il file, o
scriverne uno nuovo, devi usare il metodo XMLout per stampare il risultato.
Puoi redirigere l'output dello script, o aprire direttamente un file:
 #.....
 open HOUT, '> nuovo.xml';
 print HOUT $simple->XMLout($tree, RootName => 'replies');
 close HOUT;
Ciao.

 +--------+ |              & vCards / \ | my gpg id = 0x7C946947
Scusa l'OT, ma il tuo sito 
www.autistici.org/kral
non si vede correttamente con IE 6.
Se vuoi ti mando uno screenshot in pvt.
 Raffaello

  Raffaello
Non so sei hai ricevuto l'email che ti ho mandato, forse mi hai già
risposto ma il messaggio è stato segato da 
despammed.org
 perché non ho
ricevuto niente...
Se vuoi contattattami su kral at paranoici dot org. (Lo stesso indirizzo
del sito). Ho provato con IE6 SP 2 ad una risoluzione di 1024x768 e non
ho riscontrato problemi...
Puoi mandarmi lo screenshot e qualche info (risoluzione, os, etc..)
Grazie mille,
-- 


 Puoi mandarmi lo screenshot e qualche info (risoluzione, os, etc..)
Ok. Mo' riprovo.
 Raffaello