データベース

37. RPGでXMLを使うには(3)

前述の「RPGでXMLを使うには (2)」で日本で初めてXML-INTOを動作させたサンプル・ソースを紹介した。
しかしそれはやはり入門用のサンプルなので実際はIFSに保管されているXMLのファイルを
読んでXML-INFOで分解するところが実践として必要である。
今回はその実践的なソースを紹介しよう。

これも恐らくは日本で初めて動作するIFSからのXML-INTOの使用例である。

[ IFSからXMLを読取るXML-INTO のサンプルRPG: TESTXMLB]

ソースはこちらから

0001.00 H DFTNAME(TESTXMLB) DATEDIT(*YMD/) BNDDIR('QC2LE')                          
0002.00 H CCSID(*GRAPH:*SRC)                                                        
0003.00 F********** XML_INTO のテスト *****************************************     
0004.00 F*                                                                          
0005.00 F**********************************************************************     
0006.00                                                                             
0007.00  * CRTBNDRPG  OBJ(OBJLIB/TESTXMLB)  SRCFILE(MYSRCLIB/QRPGLESRC)             
0008.00  * DFTACTRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)                    
0009.00                                                                             
0010.00  *-------------------------------------------------------------------*      
0011.00  *  2021/11/29 : 作成                                                       
0012.00  *-------------------------------------------------------------------*      
0013.00  *( 作業変数 )                                                              
0014.00 D XMLIFS          C                   CONST('/AS400-NET.USR/TEMP/TEST.XML') 
0015.00                                                                             
0016.00 D RECORD          DS                  QUALIFIED DIM(30)                     
0017.00 D   SHCODE                1     10A                                         
0018.00 D   SHNAME               11     34A                                         
0019.00 D   SHTANK               35     41S 0                                       
0020.00 D   SHSCOD               42     45A                                         
0021.00                                                                             
0022.00  /FREE                                                                      
0023.00    XML-INTO RECORD %XML(XMLIFS:'ccsid=ucs2 case=any doc=file');             
0024.00  /END-FREE                                                         
0025.00 C                   SETON                                        LR
0026.00 C                   RETURN    


                                       

[コンパイル]

CRTBNDRPG PGM(TEST.COM/TESTXMLB) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

[解説]

今度はさらに簡単でわずか26ステップ数のRPGプログラムであるがこれまでどのIBM特約店でも
IBM SE でも作れなかったちゃんと日本語環境で動作するXML-INTOのサンプル・ソースである。

まずXMLは

0014.00 D XMLIFS          C                   CONST('/AS400-NET.USR/TEMP/TEST.XML')

と定義されているようにIFSに保存されていてその内容は

<?xml version="1.0" encoding="Shift_JIS" ?>
<RECORD>                                     
  <SHCODE>NV-BS30S  </SHCODE>                
  <SHNAME>  目次ビデオ              0002</SHSCOD>                       
</RECORD>                                     
<RECORD>                                      
  <SHCODE>NV-BS50S  </SHCODE>                 
  <SHNAME>  ビデオ画王              </SHNAME> 
  <SHTANK>200000</SHTANK>                     
  <SHSCOD>0002</SHSCOD>                       
</RECORD>                                     
  :
  :
  </RECORD>
</RESULT>  

のようになっている。
さらにこのファイルのCCSIDコード化文字セット ID)は 943 である。

XML-INTOは CCSID: 943 からEBCDICへの変換はサポートされていて
オプションの doc=file によってCCSIDはファイルからの変換が優先される。

また前の例と異なるのは

0016.00 D RECORD          DS                  QUALIFIED DIM(30)                     
0017.00 D   SHCODE                1     10A                                         
0018.00 D   SHNAME               11     34A                                         
0019.00 D   SHTANK               35     41S 0                                       
0020.00 D   SHSCOD               42     45A                                         
0021.00                                     

としてデータ構造: RECORD は DIM(30)として30レコードまで保管できるように
なっている。
さらに XML_INTO で指定するオプションは
ccsid=ucs2 case=any doc=file となっており
doc=file が指定されている。先の例ではdoc=の指定がない場合は
doc=string であることを意味している。ファイルから読むということで
doc=file を指定してXMLIFS としてファイル名を指定している。
先の文字列を指定した場合と比較してみると

XML-INTO RECORD %XML(XML:'ccsid=ucs2 case=any');
XML-INTO RECORD %XML(XMLIFS:'ccsid=ucs2 case=any doc=file');

のように%XMLの第一パラメータが文字列の指定からファイル名の指定へ
変化していることに注意して欲しい。
IFSファイルの読取りはプログラマーが記述する必要はなく
XML-INTO で読み取ってくれるのでご心配なく。

またデータ構造の定義も単一のデータ構造ではなく
IFS のXMLを読んで30レコードまでのRECORD(N)に保管することになる点にも
注意して欲しい。
このあたりの一般化は後でまた洗練された手法を紹介するので
お待ち頂きたい。
さて、これによって複数のXMLレコードを処理する方法も理解して頂けたと思う。

(1)と(2)を良く読んで理解して頂ければもうXML-INTOの扱いには自信が持てたはずだ。
なんせ動作しないサンプルではなくi5/OS Ver5.4~7.4まで確実に日本語環境で
動作するサンプルを紹介しているのでこれほど安心できることはない。

ひとつでも確実に動作できるソースを入手することができれば
後はマニュアルを見ながらでも少しずつ拡張していけばよいことである。

[参考]

RPG と XMLとの関連はIBM RPGプログラマーの手引きの最後のほうに「RPGとe-Businessの世界」としてXMLパーサーの制約とエラー・メッセージの記述があるので
テストでエラーが発生したときはこの項を参照すればよい。
このIBMの記述にXMLがサポートできるCCSIDの一覧が一応紹介されているが日本語はサポートしていないとは書かれていない。
IBMにしてみればちゃんと明記しているとの見解だろうと思うが極東地域へのサポートが失念しているように思える。
昔は日本語対応のために日本IBMのSEなどが米国に派遣されて開発に協力していたものであるが今はそのような体制にはないのだろう。