2011年5月4日水曜日

Perl XML::SAXを使ってみる

大規模のXMLを処理するならSAX。ということで、とりあえずPerlのXML::SAXを使ってみたメモ。

サンプルは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も処理できましたっと。