[bcn-pm] xml parser nyaju

pancake pancake at phreaker.net
Thu Jun 3 17:04:22 CDT 2004


Bueno, he probat amb el XML::Parser i es molt lent :// i aixo q esta basat en expat, q es C.

Ahir a la nit vaig estar una estoneta fent un parser i aqui esta el codi per si a algu li interesa, suporta tag arrel i un nivell de tags, atributs, body i comentaris. logicament no comproba si el document es correcte ni agafa mes de 1 nivell de tags, pero fa tot el q necessito i unes 10 vegades mes rapid que XML::Parser.

potser el faig orientat a objectes i amb callbacks per fer-lo servir desde fora, pq aixo es el parser a seques. I de segur que a més d'algu li anirà be per montarlo en sistemes pesats per tal d'estalviar cpu i millorar temps de resposta, s'hauria de fer alguna part per pillar els charsets i demés, pero llavors ja seria mes pesat. i el tenir mes d'un nivell de tags ja capgira una mica el codi pq caldria fer-lo recursiu, pero be, aqi esta, viam que us sembla:

:--- Parser --:
#!/usr/bin/env perl

my $msg="";

open(F,"<$ARGV[0]") or die "No such file";
while(<F>){ $msg.=$_; } $msg=~s/\n//g;
$msg=~s/<!--[^\.]*-->//g; #Strip comments
$msg=~s/<([^>]*)>/>/;
print "ROOT: '$1'\n===\n";
$msg=~s/<\/([^<>]*)>/<\/\1>\n/g;
close(F);

while(1)
{
   $msg=~/<(.*)>(.*)<\/.*>/;
   $tag=$1;chomp($tag);
   $body=$2;
   if ($tag eq "") { last; }
   $tag=~/([^\ ]*)/;
   $name=$1;
   print "NAME: '$name'\n";
   while ($tag=~/=/)
   {
      $tag=~s/([^\ ]*)=\"([^\"]*)\"//;
      print "ATTR: ($name) '$1' = '$2'\n";
   }
   chop($tag);
   print "BODY: '$body'\n";
   $msg=~s/<.*>$body<\/.*>//;

   print "==\n";
}

:--- XML d'exemple i test --:

[0:~/prg/xml]$ cat side.xml 
<side>
        <title type="2">Title of depart</title>

        <body> code</body>

        <food> 
        xxx yyy xxx zzz
        <!-- comentari
        </food>
        -->
        </food>
</side>
[0:~/prg/xml]$ ./side.pl side.xml 
ROOT: 'side'
===
NAME: 'title'
ATTR: (title) 'type' = '2'
BODY: 'Title of depart'
==
NAME: 'body'
BODY: ' code'
==
NAME: 'food'
BODY: '         xxx yyy xxx zzz         '
==
[0:~/prg/xml]$ 


apa salut i bon profit :)




More information about the Barcelona-pm mailing list