データベース

35. RPGでXMLを使うには(1)

オープン系とりわけインターネットの世界の開発ではデータ交換にXML
よく使われるようになってきている。

IBM iでも他社とのデータ交換には今後はXMLが主流になってくるであろう。
(実際にはJSONというXMLの拡張が主流になってきている)
またWebサービスでも提供されるデータ形式はほぼXMLが中心である。
IBM iでもXMLを扱うことが必須となってきておりXMLを扱うRPGの演算命令として
XML-INTOVer5.4から追加されている。
Ver5.4 でも組込み関数 %XML も使うことができる。
ところがまだ XML-INTO命令はRPGプログラマーでは馴染みがない。
XML-INTOはIBM RPG解説書やプログラマーの手引きでも
いくつも例を使って解説されていて、また他のサイトでも
英文の解説を直訳しただけの解説が紹介されているが
いずれもわかりやすい説明とはいえない。
IBM特約店やIBMでの関連サイトでもただ英文の記事を直訳しているだけであり
しかも原文の説明は細かい話に終始していてこれも決してわかりやすい説明とはいえない。
本質を語っているところがどこにもなくIBM解説書もサンプル・ソースの説明は
私たち日本人にはなかなか理解できないものである。
 
そこでXML-INTOを初めて日本人として解説することにする。
このシリーズではXMLとちは何かに始まってXML-INTOの利用方法について
例やサンブルを交えてわかりやすく説明していきたい。

■XML-INTO とは?

XML-INTO という演算は簡単に言えばXML文をデータ構造(DS)に
分解する演算である。つまりXMLのタグの値をデータ構造にマップ(照射)させるのである。
IBM解説書に次のような図で説明されているとおりである。

XML-INTOを説明する前にまず今回はXMLとパーサーについて
基本的な知識を説明する。

■XMLとは

XMLにまだ馴染みのない方のためにXMLを説明すると
XMLとはタグで構成されたデータ・ベース表記である。

例えば 商品マスター(SHOHIN)のDDSソースは

0001.00      A**********************************************                      
0002.00      A*   SHOHIN  :  商品マスターファイル          *                      
0003.00      A**********************************************                      
0004.00      A                                      UNIQUE                        
0005.00      A          R SHOHINR                   TEXT(' 商品マスターレコード ')
0006.00      A*                                                                   
0007.00      A            SHCODE        10A         COLHDG(' 商品コード ')        
0008.00      A            SHNAME        24O         COLHDG(' 商品名 ')            
0009.00      A            SHTANK         7S 0       COLHDG(' 単価 ')              
0010.00      A                                      EDTCDE(1)                     
0011.00      A            SHSCOD         4A         COLHDG(' 品種コード ')        
0012.00      A*                                                                   
0013.00      A          K SHCODE    

であり実際のデータ・ベースの内容は

商品コード    商品名                       単価    品種コード 
NV-BS30S      目次ビデオ                 165,000      0002    
NV-BS50S      ビデオ画王                 200,000      0002    
NV-CF2        薄型テレビ                  98,000      0003    
NV-CF81       更新テスト                  58,000      0004    
NV-CF9        漢字テスト                  19,000      0002    
  :

であるがこれをXMLで表現すると次のようになる。

                                                                            
<?xml version="1.0" encoding="Shift_JIS" ?>   
<RESULT FILE="QTRFIL/SHOHIN(*FIRST)">          
  <RECORD>                                     
    <SHCODE>NV-BS30S  </SHCODE>                
    <SHNAME>  目次ビデオ              </SHNAME>
    <SHTANK>165000</SHTANK>
   <SHSCOD>0002</SHSCOD>                      
 </RECORD>                                    
 <RECORD>                                     
   <SHCODE>NV-BS50S  </SHCODE>                
   <SHNAME>  ビデオ画王              </SHNAME>
   <SHTANK>200000</SHTANK>                   
   <SHSCOD>0002</SHSCOD>                      
 </RECORD>    
  :
    :
</RESULT>                                                   

  
 この例では1レコードを <RECORD> …. </RECORD> として表して
 フィールドを <FLDNAM>データ</FLDNAM> のように表記している。
つまりデータとDDSソースが混在しているようなものである。
XMLはストリーム・ファイルなのでIBM iでは通常はIFSに配置されることになる。

■バーサーとは

XMLを扱うことになるとXMLパーサーとか単にパーサーとかいう用語が出てくるが
パーサーとはXMLのタグをデータに分解することを言う。
XMLの説明で説明もなしでいきなりパーサーという用語を使って説明する解説者が多いので
XMLの説明は初めての人は大抵わからなくなってしまう。
他の開発言語ではXMLパーサーを開発するのは結構というか
かなり大変な労力を必要とするがIBM iの世界では
XMLがキーつきツリー構造のデータ・ベースであることと
本質的に変わりがないことを理解すれば
大したことではないはずだ。
読者はパーサーとはXMLを分解する内部的なプログラムの機能として
理解しておれば十分で内部で具体的にどのような処理をしているのかを
知る必要はない。
IBM iでは前述の例でおわかりのようにXMLとは単なるデータ・ベースなのである。
しかし今回のテーマはRPGでのXML-INTOの利用方法なので
XMLのデータ・ベース化は別の機会に紹介することとする。

XMLを扱っているとIBM iのエラー・メッセージにも「パーサーが…」という用語が
頻出する。パーサーとはXMLの分解と理解しておけばよい。

【補足】

どのブラウザもXMLパーサーが搭載されていてJavaScriptでXMLを扱うことができるようになっている。
ブラウザ上にXMLを表示すると単に表示されるのではなくそこで既にパーサーによる解析が行われている。
従って文法上誤りのあるXMLをブラウザに送るとエラーになってしまうことも覚えておこう。