XML::LibXML に RelaxNG を扱うためのインターフェイスもちゃんと用意されていますね。ということでコマンドラインから簡単に RELAX NG を使って XML のチェックをするためのスクリプトを書いてみました。
#!/usr/bin/perl use strict; use XML::LibXML; sub read_file { my $file = shift @_; open(FILE, $file); my @value = <FILE>; close(FILE); return @value; } die "err" if $#ARGV < 1; my $relax = shift @ARGV; my $target = shift @ARGV; my $schema = join('', read_file($relax)); my $check = join('', read_file($target)); my $rng = XML::LibXML::RelaxNG->new('string' => $schema) or die("err"); my $doc = XML::LibXML->new()->parse_string($check); if($rng->validate($doc) == 0) { print "Valid Document\n"; }
使い方:
hoge@qoo:~/test$ relax.pl check.rng valid.xml Valid Document hoge@qoo:~/test$ relax.pl check.rng invalid.xml Did not expect element cardAB there
構文に誤りがある場合は勝手にエラーを出力してくれます。ただエラーが複数あってもひとつしか出してくれないので、昨日の Python のスクリプトより若干低機能。ソースもちょう適当なので、気が向いたら書き直します。