XML::Generatorモジュール(日本語チョー訳)

by Hippo2000(1999/10/18)

XML::Generatorモジュールなのです。

なおこのドキュメントではXML::GeneratorのHTMLを元にしています。わかりにくい部分は本物を見てください。(^^;;

原本の著作権はBenjamin Holzmanさんがお持ちです。メールで了解をいただいています。

なお内容等が間違っていたら修正します。ご連絡ください


目次


名前

XML::Generator - XMLを生成するPerl拡張


概要

  use XML::Generator;
  
  my $x = new XML::Generator;
  print $x->foo($x->bar({baz=>3}, $x->bam()),
                $x->bar([qux],"Hey there,\n", "world"));
  __END__
  # 上記のコードは以下のものを生成します:
  <foo><bar baz="3"><bam/></bar><qux:bar>Hey there,
world</qux:bar></foo>

説明

XML::GeneratorXMLの生成を助ける非常に簡単なモジュールです。基本的には、まずXML::Generatorオブジェクトを作成します。そして各タグに対応するメソッド゙を、そのタグの内容をパラメータとして与えながら呼び出します。

そのタグが属性を持たなければならないのであれば、最初のパラメータとしてハッシュ・リファレンスを使うことができます。
タグがある名前空間の一部でなければならないのであれば、名前空間の各レベルが配列の要素として入っている配列リファレンスを最初のパラメータとして指定することができます(その配列の要素は
':'でつなげるられます)。XML::Generatorオブジェクトのコンストラクタに以下の引数を指定することでグローバルな名前空間を指定することができます。

'namespace' => 'HTML'

例えば、

        my $html = new XML::Generator 'namespace' => 'HTML';
        print $html->font({face => 'Arial'});

は以下のものを生成します。

        <HTML:font HTML:face="Arial" />

名前空間と属性を同時に指定したい場合には、2番目の引数をハッシュ・リファレンスにすることができます。このとき反対すると、配列リファレンスはタグの内容の一部として、単に文字列化されてしまいます。XML::Generatorオブジェクトが名前空間設定を持っており、タグにも名前空間が指定されたときには、指定された名前空間がデフォルトを置き換えます。

XML::Generatorオブジェクトが'escape'引数をもって生成されたならば、属性の内容と値が正しくないXML文字はエスケープされます。escape引数の値が'always'であれば、&、<、>(そして属性値での")は対応するXMLエンティティに置換されます。もし値が他のtrueの値であれば、疑わしい文字のまえにバックスラッシュがあれば、エスケープからはずされます。例えば:

        my $a = new XML::Generator 'escape' => 'always';
        my $b = new XML::Generator 'escape' => 'true';
        print $a->foo('<', $b->bar('3 \> 4'), '\&', '>');

は以下のようになります:

        <foo>&lt;<bar>3 \> 4</bar>\&amp;&gt;</foo>

XMLは文字列として返されます。(実際には、それ自身を文字列化、数値化、ブール化するスカラへのブレス化されたリファレンスなのですが、そのことについて何も気にする必要はありません。)

正しいXMLドキュメントは最上位にある1つのタグで構成されますが、このモジュールは、それを何ら強制しません。


バグ

属性で名前空間を使うのは簡単ではありません。

構文解析でサブルーチンとして解釈されないタグを扱うのはとてもやっかいです。例えば"some-tag"は以下のようにすることができます:

    $x = new XML::Generator;
    {
      no strict 'refs';
      print *{(ref $x).'::some-tag'}->($x, { 'attr' => 42 }, 3);
    }

これは以下のものを生成します:

    <some-tag attr="42">3</some-tag>

しかし健全な精神をお持ちであれば、私はお勧めしません。

訳者注:

この問題については以下のようにすることができます。これで日本語も安心ですね。(^_^)
このコーディングはクレイフィッシュの小山さんのコーディングを参考にしました.

=コーディング例=

    use XML::Generator;
    my $obj = new XML::Generator;
    print $obj->${\"some-tag"}(
           [ "smnm"],
           {'attr' => 42 }, 
           3
        );
    print "\n";
    $sNm = \"日本語";
    print $obj->$$sNm(
           [ "とある"],
           {'属性' => "属性の値" }, 
           "こんにちは世界"
        );

=出力結果=

<smnm:some-tag attr="42">3</smnm:some-tag>
<とある:日本語 属性="属性の値">こんにちは世界</とある:日本語>

訳者注 その2:

上記の話をHolzmanさんにメールしたところ、「こっちのほうが簡単ですよ」という指摘を受けました。
#ほぼ同時にクレイフィッシュの小山さんからもほぼ同じ内容のメールをいただきました。

=コーディング例=

    use XML::Generator;
    my $x = XML::Generator->new('escape' => 'always');
    my $tag = "some-tag";
    print $x->$tag("yup, it works");
Holzmanさんからの説明:
podでは説明が抜けていました。
最新のバージョンを使っていること、'escape'=>'always'オプションを使うことに注意してください。
(以前のバージョンがその機能を持っていないこと、既存のスクリプトを壊したくないことからデフォルトにしていません)

=出力結果=

<some-tag>yup, it works</some-tag>


作者

Benjamin Holzman, bholzman@earthlink.net


参考資料

Perl-XML FAQ
http://www.perlxml.com/faq/perl-xml-faq.html
The XML::Writer module
$CPAN/modules/by-authors/id/DMEGG/XML-Writer-0.2.tar.gz

ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。