by Hippo2000(1999/4/20)
日本語チョウ訳 XMLの巻 XML::Parser::Expatモジュールなのです。
なおこのドキュメントはXML-Parserモジュールをインストールしたときに作成される(デフォルトで入ってくるとは思いますが)C:\Perl\html\lib\site\xml\parser\Expat.htmlではなく、pod2htmlを使って抽出した内容を、私が日本語に訳そうとしたものです。
これに持ち込むまでにはちょいとややこしい手が必要なので注意。
これもやっぱり、わかりにくい説明は本物を見てください。(^^;
原本の著作権は Lary Wall氏、Clark Cooper 氏がお持ちです(詳しくは著作権情報を見てください)。Clark Cooper氏にメールで、翻訳の許可をいただきました。
内容等が間違っていたら修正します。ご連絡ください。
XML::Parser::Expat - James Clark氏のexpat XMLパーサへの下位レベルアクセス
use XML::Parser::Expat;
$parser = new XML::Parser::Expat;
$parser->setHandlers('Start' => \&sh, 'End' => \&eh,
'Default' => \&dh, 'Char' => \&ch);
open(FOO, 'info.xml') or die "Couldn't open";
$parser->parse(*FOO);
close(FOO);
# $parser->parse('<foo id="me"> here <em>we</em> go </foo>');
sub sh
{
my ($p, $el, %atts) = @_;
if ($el eq 'special')
{
$p->setHandlers('Default' => \&spec);
$p->default_current;
}
...
}
sub spec
{
my ($p, $str) = @_;
...
$p->setHandlers('Default' => \&dh);
}
このモジュールはJames Clark氏のXMLパーサであるexpatへのインターフェースを提供します。expatでは、1つのパーサのインスタンスだけが文書を解析できます。最初のparsestringの後は、呼び出すと指定されたインスタンスは死にます(die)。
Expat (そして XML::Parser::Expat) はイベントを基本としています。パーサが文書の部分を認識すると、(XML要素の開始または終了のこと)、そのタイプのイベントのために登録されているハンドラが適応するパラメータで呼び出されます。
プロトコル・エンコーディング名。デフォルトは無し。expatの組み込みエンコーディングは: UTF-8、ISO-8859-1、UTF-16、US-ASCIIです。@Encoding_Pathリストにあるディレクトリの1つにエンコーディング・マップがあれば、他のエンコーディングも使えます。この設定はXML宣言でのエンコーディングをすべて上書きします。
このオプションがtrue値で与えられると、パーサは名前空間処理を行います。デフォルトでは、名前空間処理は無効になっています。有効になると、パーサはxmlns属性を使い、その接頭語が定義された名前空間を持っているところでは、要素名や属性名から接頭語をとりはずします。名前の名前空間はnamespace メソッドを使うとわかります。そして2つの名前がまったく同じであるかはeq_nameメソッドでチェックできます。
通常パーサは、内部サブセットで定義されたエンティティ定義へのリファレンスを展開しようとします。このオプションがtrueに設定され、defaultハンドラも設定されると、文章のなかにエンティティ・リファレンスが見つかったとき、Defaultハンドラが呼び出されます。Defaultハンドラが登録されていなければ、何も影響がありません。また内部属性値のなかのエンティティの展開には何の影響も与えません。
このオプションは文字列値をとります。ストリームからの解析の途中、この文字列だけの行が見つかれば、ファイルの終わりを見つけたように、解析を終了します。これはMIMEマルチパート形式でのxml文書のストリームで使われることを考えています。文字列の後ろに改行がついてはいけません。
このオプションが指定されると、エラーは文脈でレポートされます。ErrorContextの値には エラーが発生した行の上下何行を表示するかの行数で指定します。
ハンドラを設定してそれがエラーだと判定され場合には、そのハンドラの設定ははずされます。
指定できるイベントとそれに対応するハンドラに渡されるパラメータは以下の通りです:
このイベントはXML開始タグが見つかると発生します。PerserはXML::Parser::Expatインスタンスです。Elementは開始タグによって開かれるXML要素の名前です。開始タグでの各属性毎にAttrとValはペアが設定されます。
XML終了タグが見つかると発生します。XML空要素タグ(<foo/>)はStart、Endの両方のイベントを発生させることに注意して下さい。
対応するコールバックを包む下位レベルのStart、Endハンドラが常に用意されています。これは文脈機構を取り扱います。このためDefaultハンドラ(以下を参照)はdefault_currentメソッドが呼ばれない限り開始タグ、終了タグを見ません。
このイベントはマーク付けされていない部分が見つかると発生します。マーク付けされていない文字列はStringの中にあります。1つのマーク付けされてない文字列が、複数回このハンドラ呼び出すかもしれません。元の文書で文字列の何でエンコーディングされていたとしても、ハンドラへはUTF-8で与えられます。
このイベントは処理命令が見つかると発生します。
コメントが見つかると発生します。
CDATAセクションの開始時点で呼び出されます。
CDATAセクションの終了時点で呼び出されます。
登録されているハンドラを持たない文字のために呼ばれます。これにはイベントを発生させないマーク付け(マーク付け宣言)の部分の文字列、イベントを発生するかもしれないがハンドラが何も登録されていない文字列の両方が含まれます。
元の文書でどのようにエンコーディングされたかどうかにかかわらず、文字列はハンドラにUTF-8で返されます。
パース対象外エンティティの宣言のために呼ばれます。Entityはエンティティの名前。Baseは相対URIを解決するためのベース。Sysidはシステム識別子。Pubidは公開識別子。Notationは記法名です。BaseとPubidは未定義値かもしれません。
記法宣言のために呼ばれます。Notationは記法の名前。Baseは相対URIを解決するためのベース。Sysidはシステム識別子。Pubidは公開識別子です。Base, Sysid, Pubidは未定義値かもしれません。
外部エンティティが参照されるときに呼ばれます。Baseは相対URIを解決するためのベース。Sysidはシステム識別子。Pubidは公開識別子です。BaseとPubidは未定義値かもしれません。
このハンドラは外部エンティティの内容を表す文字列、外部エンティティの内容を取得するために読むことが出来るオープンされたファイルハンドル、あるいは外部エンティティが見つからなかった事を示し、パーサをエラーにするためのundefのいずれかを返さなければなりません。
オープンされたファイルハンドルを返すならば、それはグロブ(*FOO)またはグロブへのリファレンス(つまりIO::Handleのインスタンス)でなければなりません。パーサはそれを使った後クローズします。
エンティティが内部サブセットで宣言されたときに呼ばれます。内部エンティティでは、Valパラメータは値を持ち、残り3つのパラメータは未定義値になります。外部エンティティではValパラメータは未定義値になり、Sysidパラメータはシステム識別子、Pubid パラメータには公開識別子(指定されていれば。そうでなければ未定義値)、Ndataパラメータはパース対象外エンティティのための記法が入ります。パラメータエンティティの宣言であれば、'%'が名前の前に付きます。
このハンドラと上記のUnparsedハンドラはぶつかります。両方とも設定されると、このハンドラはパース対象外エンティティのためには呼び出されません。
Elementハンドラは内部サブセットで要素宣言が見つかったときに呼び出されます。Nameは要素名、Modelは内容モデルが文字列で入ります。
内部サブセットで見つかったATTLIST宣言のなかでの各属性のために呼び出されます。そのため複数の属性をATTLIST宣言ではこのハンドラが複数回呼ばれます。Elnameパラメータは属性が関連づけられる要素名。 Attnameパラメータは属性の名前。Typeは文字列での属性の型。Defaultはデフォルト値で、"#REQUIRED", "#IMPLIED"はまたはクォート化された文字列(つまり戻りの文字列の始めと終わりはクォート文字)のいずれかになります。もしFixedがtrueならば、これは固定化された属性になります。
このハンドルは文書型(DOCTYPE)宣言のために呼ばれます。Nameは文書型名。Sysidは文書型のシステム識別子(指定されれば。そうでなければ未定義値)。Pubidは文書型の公開識別子、公開識別子が指定されなければ未定義値。Internalは内部サブセットが文字列で与えられます。なにも内部サブセットがなければ、未定義値になります。Internalは内部サブセットでの空白、コメント、処理命令、宣言のすべてが入ります。他のハンドラ(Unparsedハンドラによって処理されるパース対象外エンティティを除いて)によって処理されるかどうかに関わらず、宣言はそこにはいります。しかしコメント、処理命令は対応するハンドラで処理されていれば、現れません。
このハンドラはXML宣言のために呼ばれます。Versionにはバージョンが入った文字列。Encodingは未定義値か、エンコーディング文字列が入ります。Standaloneはtrueまたはfalseまたは未定義値で、それぞれstandalone属性がyes, no,またはまだ作成されていないことを示します。
ファイルのなかのエンコーディングがロードされ、%Encoding_Tableに保管されます。同じ名前の先に指定されたエンコーディングは置き換えられます。
この関数は自動的に、知らないエンコーディングにぶつかったときにexpatによって呼び出されます。Expatは同じエンコーディング名のためにこの関数を2度も呼び出してはいけません。ユーザがこの関数を使うのだとすれば、@Encoding_Pathリストに含まれていないエンコーディングを明確にロードするためだけです。
Larry Wall <larry@wall.org> wrote version 1.0.
Clark Cooper <coopercl@sch.ge.com> picked up support, changed the API for this version (2.x), provided documentation, and added some standard package features.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。