SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CurlデベロッパーセンターPick Up(AD)

逆引きリファレンスから見る
Curl開発「データ操作」のポイント(後編)

SAXパーサー、DOMパーサーを使ったXMLフォーマットの利用方法

  • このエントリーをはてなブックマークに追加

 この連載では、Curl開発者向けの技術情報サイト「Curlデベロッパーセンター」の「逆引きリファレンス」の記事から人気の記事をピックアップしていきます。今回は、データ操作の後編として「SAXパーサー」と「DOMパーサー」を取り上げます。

  • このエントリーをはてなブックマークに追加

はじめに

 Curlでは、Curl開発者向けに技術情報サイト「Curlデベロッパーセンター」を公開しています。前編では、このサイトの「逆引きリファレンス」で紹介している記事の中から、Webアプリケーションに必要な機能の1つであるデータ操作に着目して「バリデーションチェック」と「ActiveXを使用したExcelデータ操作」を紹介しました。

 後編となる今回は、XMLフォーマットの利用方法として「SAXパーサー」と「DOMパーサー」を使った解析方法について紹介していきます。

 Curlアプリケーションは、クライアントサイドに特化したWebテクノロジーです。従来Webサーバが行う画面の制御やデータ分析などの処理をクライアントに分散させ、サーバとの通信は必要に応じてXMLなどのデータのみとすることで、サーバ負荷を軽減し、レスポンスの向上を図ります。

 Curlアプリケーションの実行環境Curl RTEでは、このデータ形式であるXMLデータを解析するXMLパーサーを標準装備しています。このXMLパーサーを用いれば、サーバから返されたXMLデータをCurlのオブジェクトに変換し、Curlアプリケーションで使用できます。

必要環境

  • Curl RTE 5.0以上

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

 Curlでは、標準APIとしてSAX機能が用意されています。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

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

 続いて、SAX機能のほかにも、XMLフォーマットを扱うために、Curlでは拡張コンポーネントのWSDKにDOM(Document Object Model)機能が用意されています。

 DOMパーサーを使用するためには、まずWSDKをインストール及びデリゲートする必要があります。

 DOMは、XMLをツリー構造として扱うため「DOMツリー」と呼ばれています。XML全体を解析してDOMツリーとしてメモリ上に保存するため、データの多いXMLを解析する場合は多くのメモリ領域が必要になります。

 ここでは、DOMパーサーを利用したXML解析方法について、下記サンプルXMLを用いて紹介します。サンプルは、XMLから取得した値の結果をoutputプロシージャにて表示させています。

<RecordSet>
  <Record name="AAA">
    <Value>"123"</Value>
    <Value>"456"</Value>
  </Record>
  <Record name="BBB">
    <Value>"xyz"</Value>
  </Record>
</RecordSet>

XMLの読取り

 XMLフォーマットをデータモデルに変換する場合、build-xmlプロシージャを使用します。build-xmlプロシージャの戻り値はXDMDocumentオブジェクトになります。build-xmlプロシージャで解析可能なデータはUrl、StringInterface、TextInputStream、ByteInputStreamです。

let xml:XDMElement = {build-xml preserve-whitespace? = true, XMLデータ}

XMLの解析

 XMLを解析するために、まずXDMElementのrootでルートの要素を取得します。また、各子要素を取得するにはget-elementsメソッドを実行します。取得した要素から属性を取得するにはattributes、テキストを取得するにはget-textを利用します。以下に、コメント入りでサンプルを掲載します。

||build-xmlプロシージャを用いて、XMLをのCurlのXML構造体オブジェクトに変換します。
||更に、build-xmlの戻り値であるXDMDocumentから、そのXMLのルートとなるエレメントを取得します。
let root:XDMElement = {build-xml preserve-whitespace? = false, XMLデータのURL}.root

||以下XMLの解析
||get-elementsメソッドで、エレメントを取得します。
let record-elements:{Array-of XDMElement} = {root.get-elements}
  {for record-element:XDMElement in record-elements do
   ||attributesアクセッサで、属性を取得します。
      {output "Record attribute = " & record-element.attributes["name"]}
      let value-elements:{Array-of XDMElement} = {record-element.get-elements}
      {for value-element in value-elements do
     ||get-textメソッドでテキストを取得します。
        {output " Value text = " & {value-element.get-text}}
      }
  }
実行結果
Record attribute = AAA
 Value text = "123"
 Value text = "456"
Record attribute = BBB
 Value text = "xyz"

まとめ

 今回は、前後編にわたりCurlのデータ操作に着目して紹介してきました。これらはCurlのAPIのほんの一部分にすぎませんが、そのほかにもCurlデベロッパーセンターの「Curl開発者ガイド」では、Curlが提供する豊富なAPIの解説やサンプルなどを掲載しています。業務系のWebアプリケーションをより効率的に開発するために、APIを活用してみてはいかがでしょうか。

参考資料

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5860 2011/03/31 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング