PuerPerl版のXML::ParserとしてSOAP::Liteパッケージに同梱されているXML::Parser::Liteがあります。このモジュールを使えばコンパイラのないレンタルサーバなどの環境でも、XMLをパースできたります。
しかしこのモジュールにはいくつか欠点があります。設定できるコールバックの種類が少ない。シングルクォートによる囲みとダブルクォートとのそれとが混ざって使われている属性値が正しく取り出せない(例:<hoge id='foo' group="bar">)。そして最大の問題点、コールバックルーチン内からバックトラックの発生する正規表現を呼び出すとperlがクラッシュする……。
これらの問題を克服するべく改良したのが、XML::Parser::LiteHeavyです。結果としてオリジナルよりもメモリを多く喰い、処理の時間も余計にかかるので、Heavyなのです。
LiteHeavy.pm v1.03 (2004-08-27)
1.02では開始タグと閉じタグの一致を確認していないという致命的なバグがありました。古いものをお使いの方はバージョンアップしてください。
Style用モジュール
(XML-Parser-2.34に同梱のXML::Parser::Style::TreeとXML::Parser::Style::Objectsを利用)
Perl5.8.4以降版 (v.1.03ベース)
Perl5.8.4以降、正規表現の動作に変更がありましたので(参照)、通常のXML::Parser::LiteHeavyは正しく動作しなくなりました。応急措置としてこちらをお使い下さい。コールバックの種類が元のXML::Parser::Liteと同じInit, Final, Start, End, Charだけとなっています。
パスの通ったディレクトリにXML/Parserというディレクトリをつくり、そこにLiteHeavy.pmをおきます。次にXML/Parserディレクトリ上にLiteHeavy/Styleというサブディレクトリをつくり、そこにTree.pm、Object.pmをおきます。
基本的にXML::Parserと同じです。
use XML::Parser::LiteHeavy; $p1 = new XML::Parser::LiteHeavy; $p1->setHandlers( Start => sub { shift; print "start: @_\n" }, Char => sub { shift; print "char: @_\n" }, End => sub { shift; print "end: @_\n" }, ); $p1->parse('<foo id="me">Hello World!</foo>'); $p2 = new XML::Parser::LiteHeavy( Handlers => { Start => sub { shift; print "start: @_\n" }, Char => sub { shift; print "char: @_\n" }, End => sub { shift; print "end: @_\n" }, } ); $p2->parse('<foo id="me">Hello <bar>cruel</bar> World!</foo>'); $p3 = new XML::Parser::LiteHeavy(Style => 'Tree'); $tree = $p3->parsefile('test.xml');