XMLフォーマットの利用(SAXパーサー)

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