RELAX NG を Perl から使う

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 のスクリプトより若干低機能。ソースもちょう適当なので、気が向いたら書き直します。

もしかしたら参考になるかもしれないリファレンス

libxml 自体のリファレンス。 XML::LibXML::RelaxNG に関してはドキュメントが全然見つからないので (perldoc XML::LibXML::RelaxNG でも出なかったよ?) 、これかソースを読むしか情報がなさそう。ちゃんと調べていないのでもしかしたらあるのかもしれませんが。何かあれば教えてください。