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ビルダを使ってファイルや文字列から読み込むことが出来ます。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ハンドラへの入力を提供するために使われることが出来ます。
パーサによって提供されるプロパティはPerlの通常のハッシュや配列にアクセスするための文法を使って直接、使うことができます。例えば要素の名前を取得するには以下のようにします:
$element_name = $element->{Name};
しきたりとして、パーサによって提供されるすべてのプロパティは大文字/小文字がまざっています。'Parent' プロパティは'Data::Grove::Parent'モジュールを使って利用することができます。
以下に、すべてのパーサで取得できるであろうオブジェクトとそのプロパティの最小限のセットを示します。
Document オブジェクトは解析されたXMLドキュメントのルート要素の親です。
Documentの'Contents'(=内容)には、処理命令、コメント、空白もはいっているかもしれません。
いくつかのパーサはドキュメント・タイプ、XML宣言や記法、エンティティについての情報を提供します。プロパティの名前については、パーサのドキュメントをチェックしてください。
Element オブジェクトはXMLソースでの要素を表します。
純粋に最小限のGroveでは、要素の属性は平文(Perlのスカラー)になります。いくつかのパーサは属性での記法やエンティティへのアクセスを提供しています。その場合、属性は配列を持ちます。
Characters オブジェクトはXMLソースでのテキストを表します。
PI オブジェクトはXMLソースでの処理命令(processing instruction)を表します。
上記のオブジェクトの最小限のセットに加えて、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拡張モジュールがあり、必要であれば新しい拡張を作ることができます。
以下はは利用できる拡張とそれらが提供するメソッドの一覧です(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>
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。