XMLファイルからデータを取得するアプリケーションの実装

XMLファイルからデータを取得するアプリケーションの実装

IBM i2025.01.22

IBMiメインビジュアル、チャート図抜き。

はじめに

IBM PowerのOS IBM i(AS/400) の強みは、OS自体にDBMS (DB2 for IBM i)が内包されていて、 使用されるプログラミング言語RPGの各バージョンでも、データベースのデータをレコード単位で、 取得、更新、追加、削除する操作が言語の各命令で実装されているため、 RDBの表形式で表現される各種データを取り扱う業務システムの実装が容易になる、という点があります。

OSなどのプラットフォームに依存しないオープン系のプログラミング言語でデータベースを扱うシステムを構築する場合は、 データベースを扱う処理がプログラミング言語で直接実装されている訳ではないため、 データベースへのアクセスはドライバー経由で行われ、 プログラムはデータベースドライバーが提供するAPIを呼び出す形式で実装する必要があります。
データベースドライバーが提供するAPIもまた、特定のプログラミング言語に依存せず、 様々なプログラミング言語で実装されるシステムのどれからも使用できるように設計されるため、 使用するプログラミング言語によっては、親和性が低く、API呼び出しの処理自体により構築システムが複雑化する恐れもあります。

企業の各種業務の処理対象データを分析すると、最終的に大部分のデータはRDBの表形式に落とし込むことが可能なため、 RDBのDBMSをOSに内包しているIBM i(AS/400)で企業の業務システムを構築することは、 その後、業務プロセスが変化・改善され、システムも新たな業務プロセスに追随出来るように保守・更新する際に、 スムースな対応が可能になる、という優位性を持つことになります。

アプリケーションでXMLファイルを扱う処理の必要性

その一方で、業務システムの中で実装が必要な処理の中には、外部のシステムとの間でデータをインターフェースする処理が 含まれるケースが生じることもあります。RDBの表形式のデータを外部にエクスポートしたり、外部からインポートする場合は、 そのデータ形式としては、RDBの表形式データと類似の形式であるExcelなどの表計算ソフトのスプレッドシートを選択したり、 特定のソフトウェアに依存しない形式を選択したい場合は、カンマで各列のデータを区切ったCSV形式や、 各列のデータの長さが全て固定長である場合は、開始桁・終了桁で列を識別できる固定長テキストが選択されます。

しかし、近年は特定のソフトウェアに依存せず、汎用的にデータを表現できる形式として、XMLファイルも広く普及するようになりました。
XMLファイルではタグ「 ~dataxxx~ 」で囲むことでデータを表現できますが、 そのタグを入れ子にすることで、複数の階層のデータを、単一のXMLファイルでまとめて表現することが出来ます。
また、一件分の上位階層のデータの中に、複数件分の下位階層のデータを、繰り返して含めることが出来ます。

このため、例えば伝票と、その伝票に含まれる明細のような関係性のデータを表現する場合、 一つの伝票に任意の件数の明細を含めることが出来るようにしたいのであれば、 RDBの表形式のデータでは、伝票単位のデータを保持するテーブルと、伝票の明細単位のデータを保持するテーブルという様に、 2つのテーブルをそれぞれ設けて、双方のデータは共通のキー項目(例えば伝票番号)の値により突き合わせる、 という様に実装する必要があります。

しかし、XMLファイルでは、伝票を指すタグの中に伝票単位の各データ項目を含めるのと共に、 その下位の階層のデータとして、伝票明細を指すタグのデータを任意の件数含めて、その内部に伝票明細単位の各データ項目を含めることで、 伝票と、それに含まれる任意の件数の伝票明細、それぞれのデータを単一のXMLファイルでまとめて表現することが出来ます。

XMLファイルで表現できる形式のデータの例
IBMi1


このようにXMLファイルで表現可能なデータの構造は、RDBの表形式のデータの構造とは異なり、 表では複数に分割しなければならないデータを、単一のXMLファイルに含めることが可能です。
そのために、外部からのインターフェースによりシステムに取り込む必要があるデータが、 XMLファイルにより提供されるとなると、IBM i(AS/400)のRPGで実装された業務システムでは対応不可能で、 XMLのデータを表形式に変換して落とし込む処理を、システムの外部で行わなければならないと考えてしまうことが多いです。

しかし、OS IBM i(AS/400) に内包されているDBMS (DB2 for IBM i)の最新バージョンは、XMLデータを扱う機能も実装されているため、 XMLファイルで提供されるデータから、各階層の各データ項目の値を取得する処理は、 OS IBM i(AS/400)の中の機能だけでも実装可能です。ここでは、その実装例をご説明します。

XMLファイルの取り込み

まず、XMLファイルのデータをOS IBM i(AS/400)で扱うことが可能になるよう、 ファイルの内容をソースファイルに転送します。

XMLデータ(PC上のテキストファイル)
IBMi2 

IBMi3

ファイルの転送はACSなどの各種ソフトウェアでのPCとIBM i(AS/400)の間のファイル転送機能を使用して行います。
XMLファイルを一旦、IBM i(AS/400)上の統合ファイルシステム(IFS)内に保管し、 CPYFRMSTMFコマンドによりデータベースファイルへコピーすることも出来ます。

XMLファイルはタグによりデータの構造が定義されますが、ファイル内の改行はデータ構造定義には影響せず、 フリーフォーマットで各データやタグが記述出来るため、転送先の受け皿となるソースファイルは、 データの桁落ちが生じないように、レコード長をMAX値にして作成しておきます。

IBMi4

次にXMLファイルの内容を、データベースがXML形式のデータだと認識する形で、DBに格納します。
XML形式データを格納するデータベースのテーブルは、SQLのCREATE TABLE文で作成し、 データ項目の形式として「XML」を指定します。

IBMi5 

形式「XML」を指定した項目を含むテーブルにXMLファイルのデータを格納するには、 ソースファイルにコピーしたXMLファイルのデータの前後に、SQLのINSERT文を生成するための文言を付加して、 このテーブルにデータを登録するSQL INSERT文を生成して、そのSQL文を実行します。

IBMi6 ← XMLファイルの前に付加してSQL INSERT文を生成

IBMi7 ← XMLファイルの後に付加してSQL INSERT文を生成

IBMi8

IBMi9

XMLデータからの各タグのデータ値の取得

1つのXMLファイルのXMLデータの全体がデータベース格納データとなったら、 そこから各タグのデータ値を取得するには、SQLでXMLデータを扱うためのXMLTABLEキーワードを含む SQL SELECT文を実行すると、RDBでテーブルからデータをSQL SELECT文で取得した時と同様の表形式データとして、 XMLの各タグのデータ要素の値を取得することが出来ます。

IBMi10

IBMi11

IBMi12

XMLデータの中のどの階層のデータを取得するかは、各階層のタグを'/'で区切った形式のパス指定により行います。

IBMi13 

データを取得する対象のタグは、XMLTABLEキーワードの中のCOLUMNSキーワードによる列定義の中で 各列の属性定義と共にPATHキーワードで指定します。

IBMi14


取得したデータを後で各階層間で突き合わせるために、上位の階層のキー項目を含めたい時は、 PATHキーワードの指定で「'../'」を含めることで、一つ上位の階層の項目を指定することが出来ます。

このXMLTABLEキーワードを使用してXMLデータから各タグのデータ値を取得した結果は、 通常の表形式データと同じ形式となりますので、SQL SELECT文の結果をSQL INSERT文に代入して実行すれば、 各データを個別の列に格納するテーブルにデータを移すことが出来ます。
この個別の列にデータを格納するテーブルは、必ずしもSQLのCREATE TABLE文で作成する必要は無く、 物理ファイル(PF)のソースから、CRTPFコマンドを実行して作成したテーブルとすることも可能となりますので、 以降は通常のRPGやCLプログラムで表形式データを扱うのと同様に、データを参照するプログラムを実装することが出来ることとなります。

まとめ

IBM PowerのOS IBM i(AS/400) や、そのプログラミング言語RPGは、OS自体にDBMS (DB2 for IBM i)が内包されていて、 データベースを扱う処理を直接的にプログラムに実装することが可能なため、RDBの表形式データで大部分の処理対象データを扱う 企業の業務システムの実装において、高い生産性を実現出来るという優位性がありますが、 一方で、30年以上の長い歴史があり、30年以上前の当時にはまだ存在していなかったが、今日では普及したXMLデータのような、 新しいタイプのデータを扱おうとすると、対応事例が少なく情報が得られにくいケースも有ります。

しかし、OSであるIBM i(AS/400)は、バージョンアップ、リリースアップの都度、最新の普及技術に対応して、 機能を強化していますので、過去のシステムの資産と、XMLデータのような最新の技術動向を 組み合わせたソリューションを実装することも可能です。
IBM i(AS/400)の最新の対応機能の更新状況をチェックすることは、過去のシステムの資産を有効活用して、 最新の技術動向にも対応したシステムを実装することに、極めて有効なこととなります。

SOLPACが選ばれる理由

WhySOLPAC