サンプルはxmlをパースして出力するだけ。実際に使うときはここがDBに更新だったりとか、ファイルに出力だったりといった処理になると思われ。elementはNameだけしか使ってないが、start_elementのdataでちゃんとAttributesも扱える。
#!/usr/bin/perl
use strict;
use warnings;
use XML::SAX;
binmode(STDOUT, ":utf8");
my $parser = XML::SAX::ParserFactory->parser( Handler => sampleSAXHandler->new);
$parser->parse_uri('sample.xml');
package sampleSAXHandler;
use base qw(XML::SAX::Base);
sub start_document(){
print "start\n";
}
sub end_document(){
print "end\n";
}
sub start_element {
my ($self, $data) = @_;
print "$data->{Name} => ";
}
sub end_element(){
my ($self, $data) = @_;
}
sub characters {
my ($self, $data) = @_;
print $data->{Data};
}
1;
xmlは適当に<?xml version="1.0" encoding="UTF-8"?>
<sites>
<site>
<name>Google</name>
<url>http://www.google.co.jp/</url>
</site>
<site>
<name>Amazon</name>
<url>http://www.amazon.co.jp/</url>
</site>
<site>
<name>楽天</name>
<url>http://www.rakuten.co.jp/</url>
</site>
</sites>
で、実行結果start
sites =>
site =>
name => Google
url => http://www.google.co.jp/
site =>
name => Amazon
url => http://www.amazon.co.jp/
site =>
name => 楽天
url => http://www.rakuten.co.jp/
end
以上。これで数GBのXMLも処理できましたっと。