次の例では、グループ・データ項目内の購買注文の作成をシミュレートし、その購買注文の XML バージョンを生成します。
プログラム XGFX は、XML GENERATE を使用して、ソース・レコードのグループ・データ項目 purchaseOrder から基本データ項目 xmlPO に XML 出力を生成します。 ソース・レコード内の基本データ項目は、必要に応じて文字フォーマットに変換され、ソース・レコード内のデータ名から派生した名前を持つ XML 要素に挿入されます。
XGFX はプログラム Pretty を呼び出します。このプログラムは、XML PARSE ステートメントを処理プロシージャー p で使用して、XML の内容をより簡単に検証できるように、改行とインデントを使用して XML 出力をフォーマットします。
PROCESS NOMONOPRC. Identification division. Program-id. XGFX. Data division. Working-storage section. 01 numItems pic 99 global. 01 purchaseOrder global. 05 orderDate pic x(10). 05 shipTo. 10 country pic xx value 'US'. 10 name pic x(30). 10 street pic x(30). 10 city pic x(30). 10 state pic xx. 10 zip pic x(10). 05 billTo. 10 country pic xx value 'US'. 10 name pic x(30). 10 street pic x(30). 10 city pic x(30). 10 state pic xx. 10 zip pic x(10). 05 orderComment pic x(80). 05 items occurs 0 to 20 times depending on numItems. 10 item. 15 partNum pic x(6). 15 productName pic x(50). 15 quantity pic 99. 15 USPrice pic 999v99. 15 shipDate pic x(10). 15 itemComment pic x(40). 01 numChars comp pic 9(9). 01 xmlPO pic x(999). Procedure division. m. Move 20 to numItems Move spaces to purchaseOrder Move '1999-10-20' to orderDate Move 'US' to country of shipTo Move 'Alice Smith' to name of shipTo Move '123 Maple Street' to street of shipTo Move 'Mill Valley' to city of shipTo Move 'CA' to state of shipTo Move '90952' to zip of shipTo Move 'US' to country of billTo Move 'Robert Smith' to name of billTo Move '8 Oak Avenue' to street of billTo Move 'Old Town' to city of billTo Move 'PA' to state of billTo Move '95819' to zip of billTo Move 'Hurry, my lawn is going wild!' to orderComment Move 0 to numItems Call 'addFirstItem' Call 'addSecondItem' Move space to xmlPO Xml generate xmlPO from purchaseOrder count in numChars Call 'PRETTY' using xmlPO numChars Goback . Identification division. Program-id. 'addFirstItem'. Procedure division. Add 1 to numItems Move '872-AA' to partNum(numItems) Move 'Lawnmower' to productName(numItems) Move 1 to quantity(numItems) Move 148.95 to USPrice(numItems) Move 'Confirm this is electric' to itemComment(numItems) Goback. End program 'addFirstItem'. Identification division. Program-id. 'addSecondItem'. Procedure division. Add 1 to numItems Move '926-AA' to partNum(numItems) Move 'Baby Monitor' to productName(numItems) Move 1 to quantity(numItems) Move 39.98 to USPrice(numItems) Move '1999-05-21' to shipDate(numItems) Goback. End program 'addSecondItem'. End program XGFX.
Identification division. Program-id. Pretty. Data division. Working-storage section. 01 prettyPrint. 05 pose pic 999. 05 posd pic 999. 05 depth pic 99. 05 element pic x(30). 05 indent pic x(20). 05 buffer pic x(100). Linkage section. 1 doc. 2 pic x occurs 16384 times depending on len. 1 len comp pic 9(9). Procedure division using doc len. m. Move space to prettyPrint Move 0 to depth posd Move 1 to pose Xml parse doc processing procedure p Goback. p. Evaluate xml-event When 'START-OF-ELEMENT' If element not = space If depth > 1 Display indent(1:2 * depth - 2) buffer(1:pose - 1) Else Display buffer(1:pose - 1) End-if End-if Move xml-text to element Add 1 to depth Move 1 to pose String '<' xml-text '>' delimited by size into buffer with pointer pose Move pose to posd When 'CONTENT-CHARACTERS' String xml-text delimited by size into buffer with pointer posd When 'CONTENT-CHARACTER' String xml-text delimited by size into buffer with pointer posd When 'END-OF-ELEMENT' Move space to element String '</' xml-text '>' delimited by size into buffer with pointer posd If depth > 1 Display indent(1:2 * depth - 2) buffer(1:posd - 1) Else Display buffer(1:posd - 1) End-if Subtract 1 from depth Move 1 to posd When other Continue End-evaluate . End program Pretty.
<purchaseOrder> <orderDate>1999-10-20</orderDate> <shipTo> <country>US</country> <name>Alice Smith</name> <street>123 Maple Street</street> <city>Mill Valley</city> <state>CA</state> <zip>90952</zip> </shipTo> <billTo> <country>US</country> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>Old Town</city> <state>PA</state> <zip>95819</zip> </billTo> <orderComment>Hurry, my lawn is going wild!</orderComment> <items> <item> <partNum>872-AA</partNum> <productName>Lawnmower</productName> <quantity>1</quantity> <USPrice>148.95</USPrice> <shipDate> </shipDate> <itemComment>Confirm this is electric</itemComment> </item> </items> <items> <item> <partNum>926-AA</partNum> <productName>Baby Monitor</productName> <quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate> <itemComment> </itemComment> </item> </items> </purchaseOrder>
関連リファレンス
『XML GENERATE の操作』(「ILE COBOL 言語解説書」)
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.