Newsgroup: it.comp.lang.perl
Titolo: leggere xml senza usare moduli

Salve,
       so che cpan mette a disposizione moltissimi moduliper leggere e 
trattare file xml ma io avrei bisogno di farlo a "mano", questo e lo 
schema fisso del file:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
   <key></key>
   <dict>
      <key>1</key>
      <dict>
         <key>Track ID</key><integer>1</integer>
         <key>Name</key><string>Brano 1</string>
      </dict>
      <key>2</key>
      <dict>
         <key>Track ID</key><integer>2</integer>
         <key>Name</key><string>Brano 2</string>
      </dict>
      ...etc...
   </dict>
</dict>
dovrei accedere alle varie:
<dict>
   <key>Track ID</key><integer>1</integer>
   <key>Name</key><string>Brano 1</string>
 </dict>
in modo ciclico naturalmente...
credi che il trucco sia aggiustare un pò questa re che di base è inutile:
($dict) = ($_ =~ /<dict>(.*?)<\/dict>/sg);
avete qualche consiglio??
Grazie

 avete qualche consiglio??
Si,
copiare XML::Simple :-)


Ma copiare XML::Simple non è per niente simple se guardi le dipendenze
che si porta dietro (trovate con Module::ScanDeps)
$ 
scandeps.pl
 -e 'use XML::Simple'
'XML::Simple'                 => '2.16',
'Cwd'                         => '3.18',
'XML::Parser::Expat'          => '2.34',
'XML::SAX::Exception'         => '1.01',
'File::Spec'                  => '3.18',
'File::Spec::Unix'            => '1.5',
'XML::NamespaceSupport'       => '1.09',
'XML::Parser'                 => '2.34',
'XML::Parser::Style::Debug'   => 'undef',
'XML::Parser::Style::Objects' => 'undef',
'XML::Parser::Style::Stream'  => 'undef',
'XML::Parser::Style::Subs'    => 'undef',
'XML::Parser::Style::Tree'    => 'undef',
'XML::SAX'                    => '0.12',
'XML::SAX::ParserFactory'     => '1.01',
Fare il parsing di XML senza moduli si può, ma ci si complica la vita in maniera notevole.
Il formato XML è ricco e difficiele da far stare in una o più espressioni regolari.
Se hai problemi di installazione, prova PAR.
ciao
gmax
-- 
 _  _ _  _
(_|| | |(_|><  The Data Charmer
 _|
http://datacharmer.org/

 gmax
ciao, scusa se vado un pò ot, se non mi rispondi vuol dire che non era 
il caso...tu hai buone conoscenze di xml?  ecco il problema:
<xsl:template match="dict">
  <div>
   <div class="name">
    <a target="_blank">
     <xsl:attribute name="href">
      <xsl:apply-templates select="key[text()='Location']" 
mode="getAsUri"/>
     </xsl:attribute>
     <xsl:apply-templates select="key[text()='Name']" mode="getValue" />
     <xsl:text>&#160;</xsl:text>
    </a>
   </div>
  </div>
 </xsl:template>
 
 <xsl:template match="key" mode="getValue">
  <xsl:value-of select="following-sibling::*[1]" />
 </xsl:template>
 
 <xsl:template match="key" mode="getAsUri">
  <xsl:variable name="txt">
   <xsl:apply-templates select="." mode="getValue" />
  </xsl:variable>
  <xsl:text>
http://127.0.0.1:8000/
</xsl:text>
  <xsl:value-of select="substring-after($txt,'file:///')"
   disable-output-escaping="yes" />
 </xsl:template>
mi dovrebbe trasformare file:///Users/etc... in 
http://127.0.0.1:8000/Users/etc.
..
ma purtroppo poi mi rimane solo 
http://127.0.0.1:8000/
 senza il 
percorso... forse ha fatto unasostituzione troppo radicale...
sai cosa c'è di sbagliato?
Grazie

 Il formato XML č ricco e difficiele da far stare in una o piů espressioni regolari.
Da vero le uniche dipendenze sono XML::Parser (e la libreria expat). 
XML::SAX* e utilizato solo si e installato sull systema, e File::Spec e 
nell core.
-- 
mirod

 nell core.
Ciao mirod! :-)
OK, ma la sola dipendenza da XML::Parser, che è un modulo XS 
(XML::Parser::Expat) rende comunque impossibile l'uso di XML::Simple 
mediante semplice copia. Non sei d'accordo?
Ciao,
Emanuele.


In teoria si. In pratica no ;--)
Abitualmente, ce un problema per installare nuovi moduli solo con
Windows, con un *nix e abastanza facile. Ma XML::Parser viene installato
  coll Perl d'Activestate, perche e usato per ppm. Quindi praticamente,
questa dipendenza non e un problemo.
E vero che installare expat in AIX o HP/UX non e tanto facile, ma dove
sere posibile, perche fa cualque mesi, o ricevuto un patch per XML::Twig
su... VMS. Quindi si expat / XML::Parser sono OK su VMS, penso che non
sia un problema con un unix.
-- 
mirod

 sia un problema con un unix.
Sono d'accordo con te: se XML::Parser è già installato, certo che non ci 
sono problemi! ;-)
Ma io non credo che il nostro scenario sia questo, né credo si disponga 
di uno shell access (con i dovuti privilegi), altrimenti nessuno avrebbe 
sollevato problemi in merito alla disponibilità di XML::Simple.
Se si è parlato invece di impossibilità di installare XML::Simple e di 
provare a farne una semplice copia, io penso che lo scenario sia quello 
di un accesso ftp ad uno spazio web in hosting (su un server dove non è 
installato XML::Parser), o qualcosa di simile...
P.S.
Anche in quest'ultimo caso il problema sarebbe aggirabile, ma l'utente 
dovrebbe disporre (perlomeno) dello stesso ambiente del server per 
generarsi tutti i dovuti binari...
Ciao,
Emanuele.
-- 
Dottore, dottore, mi fa male il malleolo!
Malleolo si te fa male!

 generarsi tutti i dovuti binari...
OK, fa senso. En questo caso, credo che la soluzione ricomendata serebbe
di cambiare di provider!
Si no, ai ragione, conociendo la version de expat (e dov'è!), doverebbe 
sere possibile di copiare l'installazione. In teoria!
In questo caso, il migliore parser in pure perl è XML::Parser::Lite,
en la distribuzione SOAP::Lite. Quello se può copiare e usare senza
compilazione. La sua API è molto simile a quella de XML::Parser. Non lo
conosco bene ma credo che no capisce li DTDs.
-- 
mirod

 en la distribuzione SOAP::Lite.
Ah, grazie per la segnalazione, non lo conoscevo.
Non č citato neanche qui:
http://perl-xml.sourceforge.net/faq/
(ti andrebbe di segnalarglielo?)
Ciao,
Emanuele.

 (dovrebbe dircelo Larry, il quale perň rimane silente...)
l'ipotesi e che il mio provider non nessuna libreria XML con Perl...

 l'ipotesi e che il mio provider non nessuna libreria XML con Perl...
Grazie per la conferma.
Se ti va di spiegarmi meglio cosa devi fare, posso provare a fornirti 
una regex: mi spiace ma non ho proprio capito se devi sostituire ogni 
occorrenza della stringa "file:///", oppure se devi effettuare la 
sostituzione soltanto quando la stringa è "file:///Users/etc", o ancora 
se soltanto quando la stringa è contenuta tra i tag 
<xsl:text></xsl:text> ...
Ciao,
Emanuele.


Vediamo cosa succede con questo modulo, cč una discussione interesante
sul sojjeto li:
http://use.perl.org/article.pl?sid=07/01/29/1318231
-- 
mirod

 Grazie per la conferma.
Ti ringrazio lo stesso. Il mio provider ha però xml e xsl funzionanti su 
php.
ciao