XML 要素への COBOL データのマッピング

XML スキーマに基づく XML 対応 COBOL の生成」の例では、スキーマ内で検出された要素名を基に COBOL データ レコードが生成されます。ただし、既存の COBOL レコードを、サード パーティのスキーマとの通信専用に使用することも可能です。そのためには、マップ ファイルを使用して、COBOL レコードとスキーマの要素を直接的に関連付ける必要があります。

マップ ファイルを生成するには、次の形式で cbl2xml を実行します。

cbl2xml filename -m mapFile

アプリケーションを XML に対応させ、既存の COBOL レコードおよびスキーマを基に、XML ドキュメントで情報を交換する手順は次のとおりです。

  1. cbl2xml でマップ ファイルを生成します。新しいマップ ファイルを生成する場合は、存在しないファイルの名前を指定します。指定した名前のマップ ファイルが見つからない場合には、cbl2xml は新しいマップ ファイルを生成します。
  2. マップ ファイルを編集します。生成された要素の名前を、データ交換に使用するスキーマ内の既存要素の名前に変更してください。
  3. 手順 1 と同じ形式で cbl2xml を再実行します。ただし、今回は編集した既存マップ ファイルの名前を指定します。指定された名前のマップ ファイルが見つかると、cbl2xml はそのファイル内のマッピングを COBOL レコードに適用します。

以降の内容では、上記手順の詳細を説明します。

指定したマップ ファイルが存在しない場合には、cbl2xml は COBOL ファイルからデータ構造を取り込んで XML に変換し、その情報をマップ ファイルとして保存します。

次に例を示します。

COBOL レコードと XML スキーマの通信

Product_info.cpy に次のレコードが含まれているものとします。

       01  PRODUCT-INFO.
           05 PROD-ID     PIC 9(6).
           05 COMPANY-ID  PIC 9(4).
           05 CATALOG-NUM PIC 9(8).
           05 SKU-REF     PIC X(10).

通信に使用する widget.xsd 内の要素定義を次に示します。

	<xsd:element name="Widgets">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Product_Id" minOccurs="0"/>
				<xsd:element ref="Company_Id"/>
				<xsd:element ref="Catalogue_Id"/>
				<xsd:element ref="SKU"/>
				<xsd:element ref="Product_Series" minOccurs="0"/>
				<xsd:element ref="Availability"/>
				<xsd:element ref="Sale"/>
				<xsd:element ref="Base_Price_And_Unit"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

cbl2xmlproduct_info.cpy から生成するマップ ファイルを次に示します。

生成されたマップ ファイル

<?xml version="1.0" encoding="utf-8"?>
<xml-cobol-mapping-file 
   xmlns="http://xml.microfocus.com/schema/xml/v1.0/mfxmlmap.xsd" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation=
    "http://xml.microfocus.com/schema/xml/v1.0/mfxmlmap.xsd
    mfxmlmap.xsd">
   <xml-cobol-mapping>
      <cobol-name>product-info</cobol-name>
      <cobol-count-in>true</cobol-count-in>
      <xml-name>product-info</xml-name>
      <xml-type>group</xml-type>
      <xml-attribute>false</xml-attribute>
      <xml-namespace></xml-namespace>
   </xml-cobol-mapping>
   <xml-cobol-mapping>
      <cobol-name>product-info.prod-id</cobol-name>
      <cobol-count-in>true</cobol-count-in>
      <xml-name>prod-id</xml-name>
      <xml-type>string</xml-type>
      <xml-attribute>false</xml-attribute>
      <xml-namespace></xml-namespace>
   </xml-cobol-mapping>
   <xml-cobol-mapping>
      <cobol-name>product-info.company-id</cobol-name>
      <cobol-count-in>true</cobol-count-in>
      <xml-name>company-id</xml-name>
      <xml-type>string</xml-type>
      <xml-attribute>false</xml-attribute>
      <xml-namespace></xml-namespace>
   </xml-cobol-mapping>
   <xml-cobol-mapping>
      <cobol-name>product-info.catalog-num</cobol-name>
      <cobol-count-in>true</cobol-count-in>
      <xml-name>catalog-num</xml-name>
      <xml-type>string</xml-type>
      <xml-attribute>false</xml-attribute>
      <xml-namespace></xml-namespace>
   </xml-cobol-mapping>
   <xml-cobol-mapping>
      <cobol-name>product-info.sku-ref</cobol-name>
      <cobol-count-in>true</cobol-count-in>
      <xml-name>sku-ref</xml-name>
      <xml-type>string</xml-type>
      <xml-attribute>false</xml-attribute>
      <xml-namespace></xml-namespace>
   </xml-cobol-mapping>
</xml-cobol-mapping-file>

マップ ファイルは XML ドキュメントです。cbl2xml によって生成される各種のタグには、次に示すように COBOL レコードに関する特定の情報が含まれています。

マップ ファイル内のタグ名 意味
<xml-cobol-mapping-file> このファイルが、COBOL プログラム内に XML 構造を生成するために使用されるマップ ファイルであることを示しています。この要素が、マップ ファイルのルート要素です。
<xml-cobol-mapping> 1 つの COBOL データ項目に関する情報を含んでいます。<cobol-name>、<xml-name>、<xml-type>、<xml-attribute>、および <xml-namespace> の親要素です。
<cobol-name> 1 つの COBOL レコードから取り込まれたデータ項目とその親項目の名前を連結した文字列が含まれています。親項目とデータ項目の名前は、ピリオド (.) で連結されています(例:a-file-record.a-file-item)。
<cobol-count-in> <cobol-name> 内の COBOL 項目に COBOL XML の COUNT IN 句を生成するかどうかが示されています。有効値は「true」または「false」です。デフォルト値は「true」です。この値は、–nocountin コマンド ライン オプションを指定した場合には無視されます。
<xml-name> <cobol-name> 内のレコード名に対応する XML 要素名を指定しています。
<xml-type> COBOL 項目のマッピング先の XML 基本データ型。このパラメーターは、PIC 句を持つ COBOL データ項目にのみ適用されます。
<xml-attribute> <xml-name> 内で指定された要素を、XML スキーマ内で属性として扱うかどうかを示しています。有効値は「true」または「false」です。
<xml-namespace> <xml-name> 内で指定された要素の XML ネームスペースを指定するオプションの要素。集団レベルで指定されたネームスペースは、その集団に属する子要素に自動的に継承されます。

マップ ファイルを生成した後に、そのファイルを編集し、スキーマ内の XML 要素名と COBOL レコード内の COBOL 名を関連付けることによって、独自のマッピングを作成できます。具体的には、マップ ファイル内の <xml-name> で指定されている名前を、スキーマ内の要素名に合致するように編集します。この例では、「生成されたマップ ファイル」に示したマップ ファイル内の <xml-name> を次のように変更します。

変更前 変更後
<xml-name>product-info</xml-name> <xml-name>Widgets</xml-name>
<xml-name>prod-id</xml-name> <xml-name>Product_Id</xml-name>
<xml-name>company-id</xml-name> <xml-name>Company_Id</xml-name>
<xml-name>catalog-num</xml-name> <xml-name>Catalogue_Id</xml-name>
<xml-name>sku-ref</xml-name> <xml-name>SKU</xml-name>

この時点で、編集したマップ ファイルを指定して cbl2xml を再実行します。その結果、cbl2xml はスキーマおよびコピーブックを生成します。生成されたスキーマは、マップ ファイルに反映した既存要素の数にも左右されますが、元のスキーマに似たものになります。このスキーマはデフォルトで生成され、重要性も低いため、必ずしも使用する必要はありません。生成されたコピーブックには、元の COBOL レコードに、マップ ファイル内の情報に基づく適切な XML 構文拡張が付加されています。この例では、cbl2xml は次のコピーブックを生成します。

        01 product-info identified by "Widgets" 
           count in widgets-count.
         02 prod-id pic 9(6) identified by "Product_Id" 
            count in Product_Id-count.
         02 company-id pic 9(4) identified by "Company_Id" 
            count in Company_Id-count.
         02 catalog-num pic 9(8) identified by "Catalogue_Id" 
            count in Catalogue_Id-count.
         02 sku-ref pic X(10) identified by "SKU" 
            count in SKU-count.

この新しいレコードをコピーし、COBOL プログラム内に貼り付けて、元のレコードを上書きします。これで COBOL レコードは XML 対応になり、widgets.xsd スキーマに準拠する XML ドキュメントをやり取りできるようになります。