[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