Newsgroup: it.comp.lang.perl
Titolo: XML, cosa utilizzate?

Ciao,
avrei necessita di leggere (solo leggere) un file XML ricavandone un 
albero o una lista facile e veloce da scorrere.
Ho visto diversi moduli su CPAN (molto sono esagerati per le mie 
misere esigenze). Vuoi quale/i utilizzate/consigliate?
Ciao e grazie!
-- 
Daniele
togli i sette per scrivermi

 misere esigenze). Vuoi quale/i utilizzate/consigliate?
XML::Simple mappa il file XML su una struttura dati Perl.
Rapido ed efficace per un vasto insieme di compiti. Se ci 
dici qualcosa di piu` intorno al problema che devi risolvere,
si puo` essere pure piu` precisi.
ciao,
S.
-- 
Stefano Rodighiero      |  
http://larsen.perlmonk.org/blog
mailto:
lar...@perl.it
   |  Italian Perl Mongers: 
http://www.perl.it

 misere esigenze). Vuoi quale/i utilizzate/consigliate?
Confermo quanto scritto da larsen, XML::Simple va benone in molte
occasioni.
HTH,
-- 
.           .  |"in girum imus nocte et consumimur igni"
| , ,-. ,-. |  |                             -- Virgilio
|<  |   ,-| |  |
' ` '   `-^ `' |<uggc://jjj.gurqvenpfrn.bet>

Ciao!
Mi spiego meglio: tempo addietro mi avete offerto dei consigli 
interessanti sulla lettura dei paramentri per un "linguaggio" 
inventato per scriptare una mia applicazione. Poi ho pensato che non 
sarebbe stata una grande idea quella di implementare qualcosa di 
custom e che invece sarebbe stato bello passare i comandi (o gli 
oggetti) magari in XML.
E cosi', armato di un DTD scritto ad hoc, ho buttato giu' qualcosa del 
tipo...
<DOCXML>
<text name="primo" fontname="Helvetica" value="Prova di testo" x="100" 
y="100"/>
<text name="secondo" fontname="Helvetica" value="Prova di testo BIS" 
x="100" y="120"/>
<for name="ciclo" from="1" to="10">
  <text name="textinciclo" fontname="Helvetica" value="Blablabla" 
x="100" y="200"/>
</for>
</DOCXML>
...da XML:Simple mi esce...
$VAR1 = {
  'for' => {
           'ciclo' => {
      'to' => '10',
      'from' => '1',
      'text' => {
        'textinciclo' => {
                 'y' => '200',
                 'value' => 'Blablabla',
                 'fontname' => 'Helvetica',
                 'x' => '100'
               }
              }
            }
         },
  'text' => {
    'secondo' => {
         'y' => '120',
         'value' => 'Prova di testo BIS',
         'fontname' => 'Helvetica',
         'x' => '100'
       },
    'primo' => {
       'y' => '100',
       'value' => 'Prova di testo',
       'fontname' => 'Helvetica',
       'x' => '100'
             }
          }
        };
Ci sono diverse cose che "non mi vanno":
- non e' rispettato l'ordine degli elementi come da XML
- se ci sono piu' elementi dello stesso tipo (nell'esempio 'text') 
vengono raccolti sotto lo stesso ramo
- vorrei che l'attributo 'name' non diventasse un hash, ma rimanesse 
un elemento come gli altri attributi
Esemplificando, io avrei voluto mi uscisse cosi' (l'ho riscritto a 
mano, perdonate eventuali errori)...
$VAR1 = {
  'text' => {
         'name' => 'primo',
         'y' => '100',
         'value' => 'Prova di testo',
         'fontname' => 'Helvetica',
         'x' => '100'
            },
  'text' => {
         'name' => 'secondo',
         'y' => '120',
         'value' => 'Prova di testo BIS',
         'fontname' => 'Helvetica',
         'x' => '100'
            },
  'for' => {
      'name' => 'ciclo'
      'to' => '10',
      'from' => '1',
      'content' => {
            'text' => {
                       'name' => 'textinciclo',
                       'y' => '200',
                       'value' => 'Blablabla',
                       'fontname' => 'Helvetica',
                       'x' => '100'
                      }
                   }
            },
        };
Con le opzioni previste dal modulo non ho risolto niente.
Ho qualche speranza? :-)
Grazie!


             },
mmm
magari non sono tanto ferrato con gli hash... ma da quando e' possibile
avere 2 chiavi identiche? (senza sovrascrivere i valori, intendo)
-- 
Torno subito

 intendo) 
Scusami, taglia/copia/incolla e' uscito un mostro... va beh, diciamo 
che volevo l'attributo name (univoco) li' dove ho messo genericamente 
'text' e magari il 'text' tra gli attributi.
Ho provato poco fa anche il XML::TokeParser...
"XML::TokeParser provides a procedural ("pull mode") interface to 
XML::Parser"
...con poche righe riesco a far uscire quanto mi basta, che ne dite?
use XML::TokeParser;
my $p = XML::TokeParser->new('script.xml');
while( defined( my $t = $p->get_token() ) ){
    if( $t->tag ){
        if( $t->is_start_tag ) {
            # verifica il tipo di istruzione e esegue con gli 
attributi...
            print $t->tag . ', attr = ', join ',', %{$t->attr};
            print "\n";
        }
        if( $t->is_end_tag ) {
            # chiude for o altre ciclicita'
            if ($t->tag eq 'for') {
              print "chiusura " . $t->tag . "\n";


oggetti) magari in XML.
Se ti serve un linguaggio per serializzare dati, perché non usi un
linguaggio per serializzare dati (per esempio, YAML), invece di XML, che è
tutt'altra cosa anche se tutti lo usano a questo scopo?
Se invece ti serve un linguaggio di script, usa un linguaggio di script,
XML non è un linguaggio di script (al massimo, può essere considerato un
lessico inutilmente complesso e umanamente illeggibile di un linguaggio di
script tutto da definire, e che non sarà meno "custom" per essere scritto
in XML, più di quanto il turco sia vicino all'inglese perché si scrive in
un alfabeto latino).
Ciao.