Hippo2000 (2000/7/19)
SOAP::Parser - SOAPドキュメントを解析する
use SOAP::Parser;
my $parser = SOAP::Parser->new();
$parser->parsefile('soap.xml');
my $headers = $parser->get_headers();
my $body = $parser->get_body();
SOAP::Parserは、エンベロープ(Envelope)、ヘッダ(Header)そしてボディ(Body)を含めたSOAPパケットをトラバースし、名前空間を扱い、リファレンスをたどるためのロジックをすべて持っています。
これは基本的にSAXライクなパーサーの拡張です、つまり解析の結果を取得することを実装することを可能にするイベント・ドリブンなインターフェースを公開しているということです。デフォルトではこれらのイベントを取り扱うためにSOAP/PerlはSOAP::GenericInputStreamを提供します。これは単にハッシュ・リファレンスのオブジェクト・グラフを返します。もし何か違ったものがほしいのであれば、URI基本の型毎に、違った出力を生成できるように代わりのハンドラを登録することができます。詳細についてはSOAP::TypeMapperをご覧ください。
ハンドラは組みになったメソッドを実装することが必要で、SOAP::GenericInputStreamの中でデフォルトの動きがどうであるか(言い換えればSOAP::GenericInputStreamが書くメソッドのためにどのようなことをしているのか)の説明にそって概要が示されています。
この設計の利点は、SOAPパケットを解析するためにDOMを使うことを避けられることです;むしろパケットはどんなものでも必要となる最終的な形式に直接アンマーシャルされます。最初にDOMにアンマーシャルし、あなたのプログラムで意味のあるオブジェクトを作成するためにDOMをトラバースするよりも空間的にも時間的にもより効率的です。
この利点を十分にいかすために、SOAPパケットからカスタムのオブジェクト・グラフを作成するハンドラを実装する必要があるかもしれません。(詳しくはSOAP::GenericInputStreamをご覧ください)。SOAP::Parserが大変なことはすべておこなうので、ハンドラの実装(あるいはハンドラの組)には本当に苦労がいりません。
新しいパーサを作成します。複数のSOAPパケットのためにパーサを*再利用しない*ように注意してください - 作成し、利用し、そして放り投げ、もし次のパケットを解析する必要があれば新しいものを取得してください。
TypeMapperはオプションのパラメータで、オブジェクトの異なるクラスのための代わりのシリアライザとデシリアライザを登録することを可能にするSOAP::TypeMapperのインスタンスを示します。詳細はそのクラスのドキュメントを見てください。このパラメータを渡さなければ、システムはグローバルのTypeMapperを使います。
与えられた文字列を解析します。
与えられたファイルを解析します。
解析した後、この関数はSOAPエンベロープに入っているヘッダの配列を返します。
特に、この関数は0もしくはそれ以上のハッシュ・リファレンスが入った配列を返し、そのそれぞれは常に以下のような形式を取ります:
{
soap_typeuri => 'ヘッダの名前空間修飾',
soap_typename => 'ヘッダの修飾されない名前',
content => <ヘッダ・オブジェクト>
}
例えば以下のヘッダは:
<f:MyHeader xmlns:f="urn:foo">42 </f:MyHeader>
以下の形式にデシリアライズされます:
{
soap_typeuri => 'urn:foo',
soap_typename => 'MyHeader',
content => 42,
}
一方このヘッダは:
<f:MyHeader xmlns:f="urn:foo"> <m1>something</m1> <m2>something else</m2> </f:MyHeader>
以下の形式に(デフォルトで)デシリアライズされます:
{
soap_typeuri => 'urn:foo',
soap_typename => 'MyHeader',
content => {
soap_typeuri => 'urn:foo',
soap_typename => 'MyHeader',
m1 => 'something',
m2 => 'something else',
},
}
この場合、この情報は内容そのものに埋め込まれているので、soap_typeuriとsoap_typenameの冗長は厳密に必要ではないことに注意してください。しかしヘッダ内容の全体としてスカラを送信するために潜在性(そして一般的に必要性)のために、ヘッダの名前空間と型名(typename)を通信するなんらかの方法をもつ必要があります。こうのようにして、一貫性のために、内容は常に明確な型情報をもったハッシュに詰められます。
解析の後、この関数はSOAPエンベロープのボディを取り出します。
SOAPリクエストのボディとして単なるスカラをおくるとは思わないので、(上記のヘッダでやったように)その型と名前空間を持ったハッシュの中に内容をいれるという冗長なことをする必要がありません。例えば:
<f:MyBody xmlns:f="urn:foo"> <m1>something</m1> <m2>something else</m2> </f:MyBody>
以下の形式に(デフォルトで)デシリアライズされます:
{
soap_typeuri => 'urn:foo',
soap_typename => 'MyBody',
m1 => 'something',
m2 => 'something else',
}
XML::Parser::Expat SOAP::GenericInputStream SOAP::Defs
Keith Brown
SOAP::GenericInputStream
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。