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

+ XML::Groveのサブクラスへの入り口

by Hippo2000(1999/12/23)

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

なおこのドキュメントはXML::Groveモジュールをインストールしたときに一緒にはいるGrove.htmlを日本語に訳そうとしたものです。わかりにくい部分は本物を見てください。(^^;;

原本の著作権はKen MacLeod氏がお持ちです。
Ken MacLeod さんにはメールで了解をいただきました。

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

またサブクラス群は以下のようなものが提供されています。

モジュール名  説   明  
AsCanonXML XMLオブジェクトを規範的なXMLに出力します
AsString XMLオブジェクトの内容を文字列で出力します
Builder XML::Groveを構築するためのPerlSAXハンドラ
IDs Groveの中の'id'属性のインデックスを返します
Path そのパスのオブジェクトを返します
PerlSAX XMLオブジェクトのためのPerlSAX イベント・インターフェース
Sub Groveにフィルター・サブルーチンを実行します
Subst 値をテンプレートで置換します
XPointer 一度はXPointerのつもりであった、廃れてしまったモジュール

目次


名前

XML::Grove - Perl形式のXMLオブジェクト


概要

 use XML::Grove;
 # 基本解析およびGroveの構築
 use XML::Grove::Builder;
 use XML::Parser::PerlSAX;
 $grove_builder = XML::Grove::Builder->new;
 $parser = XML::Parser::PerlSAX->new ( Handler => $grove_builder );
 $document = $parser->parse ( Source => { SystemId => 'filename' } );
 # 新しいオブジェクトの生成
 $document = XML::Grove::Document->new ( Contents => [ ] );
 $element = XML::Grove::Element->new ( Name => 'tag',
                                       Attributes => { },
                                       Contents => [ ] );
 # XMLオブジェクトへのアクセス
 $tag_name = $element->{Name};
 $contents = $element->{Contents};
 $parent = $element->{Parent};
 $characters->{Data} = 'XML is fun!';

説明

XML::Groveは解析あるいは格納されたXML、HTMLまたはSGMLインスタンスの情報にアクセスするためのツリー構造をベースとしたオブジェクト・モデルです。 XML::Grove オブジェクトはPerlのハッシュと配列で、通常のPerl文法を使ってオブジェクトのプロパティにアクセスすることができます。

  $text = $characters->{Data};

Groveの作り方

Groveを生成するにはいくつもの方法があります。パーサとgroveビルダを使ってファイルや文字列から読み込むことが出来ます。XML::Grove::Objectsの'new()'メソッドを使ってPerlコードによって生成することも出来ます。またデータベースや他のソースもgroveとして振る舞うことが出来ます。

Groveを構築する最も一般的な方法は、パーサとgroveビルダを使うことです。パーサはXMLファイルの文字を読み込み、XML文法を理解し、要素(タグ)、テキスト(キャラクタ)、処理命令、その他の並びがあるとき、"イベント"報告を発生します。Groveビルダはこれらのイベントを受け取り("消費し(consume)"または"扱い(handle)")、XML::Groveオブジェクトを生成します。パーサは最後にGroveビルダが生成し、すべての要素と文字データが入ったXML::Grove::Documentオブジェクトを返します。

最も一般的なパーサとGroveビルダは(libxml-perlの中の)XML::Parser::PerlSAX と XML::Grove::Builderです。Groveを構築するには、まずGroveビルダを生成してください:

  $grove_builder = XML::Grove::Builder->new;

そしてパーサを生成し、Groveビルダにハンドラ(handler)として渡してください:

  $parser = XML::Parser::PerlSAX->new ( Handler => $grove_builder );

これは、このパーサでドキュメントを解析するたびにXML::Grove::Documentオブジェクトを返すようにGroveビルダとパーサを関連付けます。ファイルを解析するには、解析したいファイル(URLまたはパス)の'SystemId' パラメータが入った'Source'パラメータを'parse()'メソッドに使ってください。

  $document = $parser->parse ( Source => { SystemId => 'kjv.xml' } );

Perl変数に入った文字列を解析するには、'String'パラメータのはいった'Source'パラメータを使ってください:

  $document = $parser->parse ( Source => { String => $xml_text } );

XML::Grove::Builderでは以下のすべてのパーサが機能します:

  XML::Parser::PerlSAX (in libxml-perl, uses XML::Parser)
  XML::ESISParser      (in libxml-perl, uses James Clark's `nsgmls')
  XML::SAX2Perl        (in libxml-perl, translates SAX 1.0 to PerlSAX)

下記のように、たいていのパーサは標準の情報セットよりも多くのプロパティを設定します。XML::Groveはパーサにより与えられたすべてのプロパティを使えるようにします。指定できる追加のプロパティを見つけるためにはパーサのドキュメントをご覧ください。

しかし、まだ使えないものもあります(1999年8月時点)。PerlSAX filterはXML::Grove::Builderに渡される前にパーサの出力を処理するために使うことが出来ます。XML::Grove::PerlSAXはPerlSAX filterまたは他のPerlSAXハンドラへの入力を提供するために使われることが出来ます。


Groveの使い方

パーサによって提供されるプロパティはPerlの通常のハッシュや配列にアクセスするための文法を使って直接、使うことができます。例えば要素の名前を取得するには以下のようにします:

  $element_name = $element->{Name};

しきたりとして、パーサによって提供されるすべてのプロパティは大文字/小文字がまざっています。'Parent' プロパティは'Data::Grove::Parent'モジュールを使って利用することができます。

以下に、すべてのパーサで取得できるであろうオブジェクトとそのプロパティの最小限のセットを示します。


XML::Grove::Document

Document オブジェクトは解析されたXMLドキュメントのルート要素の親です。

Contents
ルート要素が入った配列。

Documentの'Contents'(=内容)には、処理命令、コメント、空白もはいっているかもしれません。

いくつかのパーサはドキュメント・タイプ、XML宣言や記法、エンティティについての情報を提供します。プロパティの名前については、パーサのドキュメントをチェックしてください。


XML::Grove::Element

Element オブジェクトはXMLソースでの要素を表します。

Parent
このelementの親オブジェクト
Name
文字列、このelementの要素タイプ名。
Attributes
文字列または配列のハッシュ
Contents
element、characters,PIなどの配列。

純粋に最小限のGroveでは、要素の属性は平文(Perlのスカラー)になります。いくつかのパーサは属性での記法やエンティティへのアクセスを提供しています。その場合、属性は配列を持ちます。


XML::Grove::Characters

Characters オブジェクトはXMLソースでのテキストを表します。

Parent
このCharactersオブジェクトの親オブジェクト
Data
Charactersの文字列

XML::Grove::PI

PI オブジェクトはXMLソースでの処理命令(processing instruction)を表します。

Parent
PIオブジェクトの親オブジェクト
Target
文字列、処理命令ターゲット
Data
文字列、処理命令のデータまたは何も指定されなければundef

上記のオブジェクトの最小限のセットに加えて、XML::Groveは、パーサが以下のオブジェクトを提供することを知っています。これらのオブジェクトのプロパティについての説明については、パーサのドキュメントをご覧下さい。

  XML::Grove::
  ::Entity::External  外部エンティティ・リファレンス(External entity reference)
  ::Entity::SubDoc    外部SubDocリファレンス(SGML)(External SubDoc reference (SGML))
  ::Entity::SGML      外部SGMLリファレンス(SGML)(External SGML reference (SGML))
  ::Entity            エンティティ・リファレンス(Entity reference)
  ::Notation          記法宣言(Notation declaration)
  ::Comment           <!-- コメント -->(<!-- A Comment -->)
  ::SubDoc            解析されたドキュメント(SGML)(A parsed subdocument (SGML))
  ::CData             CDATAがマークされたセクション(A CDATA marked section)
  ::ElementDecl       DTDからの要素宣言(An element declaration from the DTD)
  ::AttListDecl       DTDからの要素の属性宣言(An element's attribute declaration, from the DTD)

メソッド

XML::Groveそれ自身は1つのメソッド、new()だけを提供します。XML::Groveオブジェクトを生成します。XML::Groveオブジェクトで機能する追加のメソッドを与えるData::GroveとXML::Grove拡張モジュールがあり、必要であれば新しい拡張を作ることができます。

$obj = XML::Grove::OBJECT->new( [PROPERTIES] )
'new'は新しいXML::GroveオブジェクトをタイプOBJECTで、初期PROPERTIESをもって生成します。PROPERTIES はキーと値の組のリストやハッシュ、コピーするXML::Groveオブジェクトするによって指定することができます。OBJECTは上記にあげたリストから指定することができます。

以下はは利用できる拡張とそれらが提供するメソッドの一覧です(1999年2月時点)。それらの使い方についての詳細はそれらのモジュールのドキュメントをご覧下さい。

  XML::Grove::AsString
    as_string       Groveの部分を文字列で返します。
    attr_as_string  要素の属性を文字列で返します。
  XML::Grove::AsCanonXML
    as_canon_xml    規範的なXMLフォーマットでXMLテキストを返します
  XML::Grove::PerlSAX
    parse           Groveオブジェクトを使ってPerlSAXパーサをエミュレートします
  Data::Grove::Parent
    root            Groveのルート要素を返します。
    rootpath        ルート要素とこのオブジェクトを含めて、それらの間にあるすべての
                    オブジェクトの配列を返します。
    Data::Grove::Parentも'C<Parent>'と'C<Raw>'プロパティをGroveオブジェクトに追加します。
    
  Data::Grove::Visitor
    accept          オブジェクトのタイプ名でサブルーチンをコールバックします。
    accept_name     要素またはタグ名を使ってコールバックします。
    children_accept Contentsの子供のそれぞれについて、サブルーチンをコールバックします。
    children_accept_name  same, but using tag names
    attr_accept     属性の中のオブジェクトについてコールバックします。
  XML::Grove::IDs
    get_ids         Groveの中のすべてのID属性のリストを返します。
  XML::Grove::Path
    at_path         $el->at_path('/html/body/ul/li[4]')
  XML::Grove::Sub
    filter          Groveの中のすべてのオブジェクトに対してサブルーチンを実行します。

拡張の書き方

'XML::Grove'クラスはXML::Groveモジュールのなかのすべてのクラスのスーパークラスです。'XML::Grove'は'Data::Grove'のサブクラスです。

拡張を作成して、すべてのXML::Groveオブジェクトにメソッドを追加したいならば、XML::Groveパッケージのなかに、そのメソッドを作成してください。多くの拡張はXML::Grove::Documentそして/またはXML::Grove::Elementにだけメソッドを追加する必要があります。

拡張を作成したときには、あなたのパッケージからのオブジェクトを使ってあなたのモジュールを呼び出す方法も確実に提供しなければなりません。例えばXML::Grove::AsStrringの'as_string()'メソッドはXML::Grove::AsStringオブジェクトからも以下のようにして呼び出すことが出来ます。

  $writer= new XML::Grove::AsString;
  $string = $writer->as_string ( $xml_object );

作者

Ken MacLeod, ken@bitsko.slc.ut.us


参考資料

perl(1), XML::Grove(3)

Extensible Markup Language (XML) <http://www.w3c.org/XML>


ホーム Perlの小技

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