|
XMLフォーマットを扱う場合、Curlでは標準APIとしてSAX(Simple API for XML)機能が用意されています。SAXはXML文書を先頭から解析し、発生したイベントをアプリケーションでキャッチして処理するAPIです。DOMに比べ、解析速度が速く少量のメモリ消費量というメリットがありますが、ノードの追加、削除等、XML文書を更新する機能はありません。
ここではSAXパーサーを利用したXML解析方法について、下記サンプルXMLを用いて説明します。
|
<RecordSet> <Record name="AAA"> <Value>"123"</Value> <Value>"456"</Value> </Record> <Record name="BBB"> <Value>"xyz"</Value> </Record> </RecordSet>
|
SAXパーサーを使用するためには、まずDefaultHandlerクラスを継承したイベントハンドラを作成します。このクラスのstart-document、end-document、start-element、end-element、charactersメソッドを実装します。下記サンプルは、それぞれのメソッドで取得したXMLの値等をoutputプロシージャにて結果を表示させています。
|
{define-class public MySAXApp {inherits DefaultHandler} {constructor public {default } {construct-super} }
{method public {start-document}:void {output "#start-document"} }
{method public {end-document}:void {output "#end-document"} }
{method public {start-element uri:String, name:String, qname:String, atts:Attributes }:void {output "#start-element"} {output " タグ = " & name} {output " 属性名 = " & {atts.get-local-name 0}} {output " 属性 = " & {atts.get-value 0}} }
{method public {end-element uri:String, name:String, qname:String }:void {output "#end-element"} {output " タグ = " & name} }
{method public {characters ch:StringBuf, start:int, length:int }:void {output "#characters"} {output " 要素 = " & ch} } }
|
各XML構文解析イベントを受け取り呼び出されるメソッドの説明は下表の通りです。
| start-document |
ドキュメント開始の通知を受け取ります。 |
| end-document |
ドキュメント終了の通知を受け取ります。 |
| start-element |
要素の開始の通知を受け取ります。 XML ドキュメント内の各要素の開始時にこのメソッドを起動します。
|
| end-element |
要素の終了の通知を受け取ります。 XML ドキュメント内の各要素の最後にこのメソッドを起動します。
|
| characters |
文字データの通知を受け取ります。 |
XML構文解析イベントの流れは、まずstart-documentメソッドが実行されます。ノードを読み込むとstart-elementメソッドが実行され、タグ名や属性等を取得できます。次にstart-elementメソッドが終了すると、charactersメソッドが実行され、テキストを取得できます。最後に終了タグを読み込むため、end-elementメソッドの中身が実行されます。
これらのハンドラの呼び出し方法は、以下のようにSAXパーサーを作成し、set-content-handlerを使用して上記で作成したイベントハンドラを登録します。
|
{let xr:XMLReader = {SAXParser}} {let handler:MySAXApp = {MySAXAppt}} {xr.set-content-handler handler}
|
上記にて作成したSAXパーサーのparseメソッドを使用してXMLデータを解析します。
|
{xr.parse {InputSource system-id = XMLデータのURL}}
|
実行結果
#start-document #start-element タグ = RecordSet 属性名 = <null> 属性 = <null> #characters 要素 = #start-element タグ = Record 属性名 = name 属性 = AAA #characters 要素 = #start-element タグ = Value 属性名 = <null> 属性 = <null> #characters 要素 = "123" #end-element タグ = Value #characters 要素 = #start-element タグ = Value 属性名 = <null> 属性 = <null> #characters 要素 = "456" #end-element タグ = Value #characters 要素 = #end-element タグ = Record #characters 要素 = #start-element タグ = Record 属性名 = name 属性 = BBB #characters 要素 = #start-element タグ = Value 属性名 = <null> 属性 = <null> #characters 要素 = "xyz" #end-element タグ = Value #characters 要素 = #end-element タグ = Record #characters 要素 =
#end-element タグ = RecordSet #end-document
サポートバージョン
RTE5.0以上
参考ドキュメント
http://developers.curlap.com/curl/docs/rte/6.0/ja/docs/ja/dguide/using-sax-xml.html
|