COBOL データを XML に変換するには、以下の例のように XML GENERATE ステートメントを使用してください。
XML GENERATE XML-OUTPUT FROM SOURCE-REC
COUNT IN XML-CHAR-COUNT
ON EXCEPTION
DISPLAY 'XML generation error ' XML-CODE
STOP RUN
NOT ON EXCEPTION
DISPLAY 'XML document was successfully generated.'
END-XML
XML GENERATE ステートメントでは、XML 出力を受け取るデータ項目 (上の例では XML-OUTPUT) をまず識別します。データ項目は、生成された XML 出力を格納できる十分な大きさに定義します。通常、データ名の長さに応じて、COBOL ソース・データ・サイズの 5 倍から 10 倍に定義します。
DATA DIVISION では、受信 ID を、英数字 (英数字グループ項目またはカテゴリー英数字の基本項目のどちらか) として、あるいは国別 (国別グループ項目またはカテゴリー国別の基本項目のどちらか) として宣言できます。
次に、XML フォーマットに変換されるソース・データ項目 (この例では SOURCE-REC) を識別します。 ソース・データ項目は、英数字グループ項目、国別グループ項目、あるいはクラス英数字または国別の基本データ項目にすることができます。
COBOL データ項目の中には、XML に変換されず無視されるものがあります。 XML に変換する英数字グループ項目または国別グループ項目の従属データ項目は、次のような場合は無視されます。
ソース・データ項目の中の次のような項目も、XML の生成時に無視されます。
XML を読みやすくするために余分な空白文字 (例えば、改行または字下げ) が挿入されることはありません。
必要に応じて、COUNT IN 句をコーディングして、XML 出力の生成時に充てんされる XML 文字エンコード・ユニット数を取得できます。 受け取る ID のカテゴリーが国別である場合、カウントは、UTF-16 文字エンコード・ユニット数です。 すべての他のエンコード (UTF-8 を含む) では、カウントはバイト数です。
カウント・フィールドを参照変更長として使用して、生成された XML 出力を含む受け取りデータ項目の一部のみを取得できます。例えば、XML-OUTPUT(1:XML-CHAR-COUNT) は、XML-OUTPUT の最初の XML-CHAR-COUNT 文字位置を参照します。
次のプログラムの抜粋を検討します。
01 doc pic x(512).
01 docSize pic 9(9) binary.
01 G.
05 A pic x(3) value "aaa".
05 B.
10 C pic x(3) value "ccc".
10 D pic x(3) value "ddd".
05 E pic x(3) value "eee".
. . .
XML Generate Doc from G
上のコードによって、次の XML 文書が生成されます。ここで、A、B、および E は、エレメント G の子エレメントとして表され、 C および D は、エレメント B の子エレメントになります。
<G><A>aaa</A><B><C>ccc</C><D>ddd</D></B><E>eee</E></G>
また、XML GENERATE ステートメントの ATTRIBUTES 句を指定することもできます。 ATTRIBUTES 句を使用すると、生成された XML 文書内に含まれる各基本データ項目が (このようなデータ項目が FILLER 以外の名前を持ち、データ記述項目に OCCURS 節がない場合)、子エレメントとしてではなく、 すぐ上位のデータ項目に対応する XML エレメントの属性として表されます。
たとえば、上記プログラムの抜粋の XML GENERATE ステートメントが次のようにコーディングされたとします。
XML Generate Doc from G with attributes
このコードによって次の XML 文書が生成されます。ここで、A および E は、エレメント G の属性として表され、 C および D はエレメント B の属性になります。
<G A="aaa" E="eee"><B C="ccc" D="ddd"></B></G>
オプションとして、ENCODING 句をコーディングして、生成される XML 文書の CCSID を指定することもできます。 ENCODING 句を使用しなかった場合、文書エンコードは受け取りデータ項目のカテゴリーおよび CODEPAGE コンパイラー・オプションによって決まります。 詳細については、生成された XML 出力のエンコードの制御に関する下記の関連タスクを参照してください。
オプションとして、XML-DECLARATION 句をコーディングして、生成された XML 文書にバージョン情報およびエンコード宣言を含んだ XML 宣言を組み込むことができます。 受け取りデータ項目のカテゴリーによって次のようになります。
たとえば、下記のプログラムの抜粋では、XML GENERATE の XML-DECLARATION 句を指定して、エンコードを CCSID 1208 (UTF-8) で指定しています。
01 Greeting.
05 msg pic x(80) value 'Hello, world!'.
. . .
XML Generate Doc from Greeting
with Encoding 1208
with XML-declaration
End-XML
上のコードによって、次の XML 文書が生成されます。
<?xml version="1.0" encoding="UTF-8"?><Greeting><msg>Hello, world!</msg></Greeting>
XML-DECLARATION 句をコーディングしなければ、XML 宣言は生成されません。
オプションとして、NAMESPACE 句をコーディングして、生成される XML 文書の名前空間を指定することもできます。 名前空間の値は有効な URI (Uniform Resource Identifier) (例: URL (Uniform Resource Locator)) である必要があります。 詳細については、下記の URI 構文に関する関連概念を参照してください。
名前空間は、カテゴリーが国別または英数字の ID またはリテラルで指定します。
名前空間を指定して名前空間接頭部 (下記) を指定しない場合には、その名前空間は文書のデフォルト名前空間になります。 つまり、ルート・エレメントで宣言された名前空間が文書内のルート・エレメントを含む各エレメント名にデフォルトで適用されます。
たとえば、次のデータ定義および XML GENERATE ステートメントを検討してみましょう。
01 Greeting.
05 msg pic x(80) value 'Hello, world!'.
01 NS pic x(20) value 'http://example'.
. . .
XML Generate Doc from Greeting
namespace is NS
次に示すとおり、結果として得られる XML 文書は、デフォルト名前空間 (http://example) を持ちます。
<Greeting xmlns="http://example"><msg>Hello, world!</msg></Greeting>
名前空間を指定しなければ、生成される XML 文書内のエレメント名は、どの名前空間にも属しません。
オプションとして、NAMESPACE-PREFIX 句をコーディングして、生成される文書内の各エレメントの開始および終了タグに適用する接頭部を指定することもできます。 接頭部は、上述のように名前空間を指定した場合にのみ指定できます。
XML GENERATE ステートメントを実行する場合、接頭部の値はコロン (:) のない、有効な XML 名である必要があります。 詳細については、名前空間に関する関連参照を参照してください。 値には末尾スペースを含めることができますが、接頭部の使用前に除去されます。
名前空間接頭部は、カテゴリーが国別または英数字の ID またはリテラルで指定します。
接頭部は、各エレメントの開始および終了タグを修飾するため、短くすることを推奨します。
たとえば、次のデータ定義および XML GENERATE ステートメントを検討してみましょう。
01 Greeting.
05 msg pic x(80) value 'Hello, world!'.
01 NS pic x(20) value 'http://example'.
01 NP pic x(5) value 'pre'.
. . .
XML Generate Doc from Greeting
namespace is NS
namespace-prefix is NP
次のように、結果として得られる XML 文書は明示的な名前空間 (http://example) を持ち、接頭部 pre がエレメント Greeting および msg の開始および終了タグに適用されます。
<pre:Greeting xmlns:pre="http://example"><pre:msg>Hello, world!</pre:msg></pre:Greeting>
さらに、XML 文書の生成後に制御を受け取るために、以下の句のいずれかまたは両方を指定できます。
XML GENERATE ステートメントを終了するには、明示範囲終了符号の END-XML を使用します。条件ステートメントで ON EXCEPTION または NOT ON EXCEPTION 句を指定している XML GENERATE ステートメントをネストするには、END-XML をコーディングします。
XML への COBOL ソース・レコードの変換が完了するか、またはエラーが発生するまで、XML 生成は継続します。 エラーが発生した場合、結果は次のようになります。
XML 生成時にエラーが発生しなかった場合、XML-CODE 特殊レジスターにはゼロが入り、制御は、NOT ON EXCEPTION 句が指定されている場合はこの句に、指定されていない場合は XML GENERATE ステートメントの最後に渡されます。
関連参照
データのクラスおよびカテゴリー (Enterprise COBOL 言語解説書)
XML GENERATE ステートメント (Enterprise COBOL 言語解説書)
Extensible Markup Language (XML)
Namespaces in XML 1.0