次の例が含まれています。
XML ツールキットを使用して、Natural グループ構造を XML ドキュメントに変換するコピーコードを生成できます。
コールバックコピーコードでは、次のオペランドを使用します。
オペランド | フォーマット/長さ | 説明 | PARSER-X から | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A | 要素構造を表す ex-XPATH | オペランド 2 | ||||||||||||||
2 | A1 |
XPATH の内容のタイプ:
|
オペランド 3 | ||||||||||||||
3 | A | 解析されたデータ | オペランド 4 | ||||||||||||||
4 | L | 解析されたデータが空の場合、TRUE | オペランド 5 | ||||||||||||||
5 | I4 | カウンタ変数 1 次元 | |||||||||||||||
6 | I4 | カウンタ変数 2 次元 | |||||||||||||||
7 | I4 | カウンタ変数 3 次元 |
* ---------------------------------------------------------------------- * Parameter Definition * * &1& 'XML' /* XML Document * &2& '#CX' /* Counter Variable 1st Dimension * &3& '#CY' /* Counter Variable 2nd Dimension * &4& '#CZ' /* Counter Variable 3rd Dimension * ---------------------------------------------------------------------- * DTD E-\SAG\nat\NATAPPS\FUSER\XMLTK\RES\empl.dtd COMPRESS &1& '<EMPLOYEE' ' PERSONNEL-ID="'EMPLOYEE.PERSONNEL-ID '"' '>' INTO &1& LEAVING NO /* now the children COMPRESS &1& '<FULL-NAME' '>' INTO &1& LEAVING NO /* now the children COMPRESS &1& '<FIRST-NAME' '>' EMPLOYEE.FIRST-NAME '</FIRST-NAME>' INTO &1& LEAVING NO COMPRESS &1& '<NAME' '>' EMPLOYEE.NAME '</NAME>' INTO &1& LEAVING NO /* COMPRESS &1& '</FULL-NAME>' INTO &1& LEAVING NO COMPRESS &1& '<FULL-ADDRESS' '>' INTO &1& LEAVING NO /* now the children FOR &2& = 1 TO EMPLOYEE.C@ADDRESS-LINE COMPRESS &1& '<ADDRESS-LINE' '>' EMPLOYEE.ADDRESS-LINE(&2&) '</ADDRESS-LINE>' INTO &1& LEAVING NO END-FOR COMPRESS &1& '<CITY' '>' EMPLOYEE.CITY '</CITY>' INTO &1& LEAVING NO COMPRESS &1& '<ZIP' '>' EMPLOYEE.ZIP '</ZIP>' INTO &1& LEAVING NO COMPRESS &1& '<COUNTRY' '>' EMPLOYEE.COUNTRY '</COUNTRY>' INTO &1& LEAVING NO /* COMPRESS &1& '</FULL-ADDRESS>' INTO &1& LEAVING NO COMPRESS &1& '<TELEPHONE' '>' INTO &1& LEAVING NO /* now the children COMPRESS &1& '<PHONE' '>' EMPLOYEE.PHONE '</PHONE>' INTO &1& LEAVING NO COMPRESS &1& '<AREA-CODE' '>' EMPLOYEE.AREA-CODE '</AREA-CODE>' INTO &1& LEAVING NO /* COMPRESS &1& '</TELEPHONE>' INTO &1& LEAVING NO COMPRESS &1& '<JOB-TITLE' '>' EMPLOYEE.JOB-TITLE '</JOB-TITLE>' INTO &1& LEAVING NO FOR &2& = 1 TO EMPLOYEE.C@INCOME COMPRESS &1& '<INCOME' '>' INTO &1& LEAVING NO /* now the children COMPRESS &1& '<SALARY' '>' EMPLOYEE.SALARY(&2&) '</SALARY>' INTO &1& LEAVING NO FOR &3& = 1 TO EMPLOYEE.C@BONUS(&2&) COMPRESS &1& '<BONUS' '>' EMPLOYEE.BONUS(&2&,&3&) '</BONUS>' INTO &1& LEAVING NO END-FOR /* COMPRESS &1& '</INCOME>' INTO &1& LEAVING NO END-FOR /* COMPRESS &1& '</EMPLOYEE>' INTO &1& LEAVING NO
* ---------------------------------------------------------------------- * CLASS NATURAL XML TOOLKIT * * * DESCRIPTION * Serialize a given Data structure. * * * AUTHOR SAG 01.2006 * * VERSION 6.2. * * (c) Copyright Software AG 2006. All rights reserved. * * ---------------------------------------------------------------------- * DEFINE DATA LOCAL USING EMPL /* add generated data structure LOCAL 1 XML (A) DYNAMIC * 1 OUT (A72) 1 II (I4) * 1 OUTDYN (A) DYNAMIC 1 OBJLEN (I4) 1 OBJEND (I4) 1 OBJSTART (I4) 1 OBJLINE (I4) * 1 #CX (I4) 1 #CY (I4) 1 #CZ (I4) END-DEFINE * EMPLOYEE.PERSONNEL-ID := 4711 * EMPLOYEE.FIRST-NAME := "ADKINSON" EMPLOYEE.NAME := "MARTHA" * EMPLOYEE.C@ADDRESS-LINE := 2 EMPLOYEE.ADDRESS-LINE(1) := "8603 GARLAND COURT" EMPLOYEE.ADDRESS-LINE(2) := "FRAMINGHAM" EMPLOYEE.ADDRESS-LINE(2) := "MA" EMPLOYEE.CITY := "FRAMINGHAM" EMPLOYEE.ZIP := "17010" EMPLOYEE.COUNTRY := "USA" * EMPLOYEE.AREA-CODE := "617" EMPLOYEE.PHONE := "210-4703" * EMPLOYEE.JOB-TITLE := "MANAGER" EMPLOYEE.C@INCOME := 2 EMPLOYEE.SALARY(1) := 47000 EMPLOYEE.C@BONUS(1) := 2 EMPLOYEE.BONUS(1,1) := 10500 EMPLOYEE.BONUS(1,2) := 7875 * EMPLOYEE.SALARY(2) := 47000 EMPLOYEE.C@BONUS(2) := 1 EMPLOYEE.BONUS(2,1) := 35700 * INCLUDE EMPL-C "XML" "#CX" "#CY" "#CZ" /* add generated Serialize * FOR II = 1 TO *LENGTH(XML) STEP 72 OUT := SUBSTR(XML,II) WRITE OUT END-FOR * NEWPAGE * /* WRITE COMPLETE (A) DYNAMIC VARIABLE IF POSSIBLE USE CR AND IGNORE LF OBJSTART := 1 * EXAMINE xml FOR "><" REPLACE WITH ">" - H'0A' -"<" EXAMINE xml FOR H'0A' GIVING POSITION OBJEND * REPEAT WHILE OBJEND NE 0 /* IF OBJSTART GT 0 THEN ADD OBJSTART TO OBJEND END-IF /* OBJLEN := OBJEND - OBJSTART -1 /* IF OBJLEN > 0 THEN OUTDYN := SUBSTRING(xml, OBJSTART, OBJLEN) /* FOR OBJLINE = 1 TO *LENGTH(OUTDYN) STEP 72 OUT := SUBSTR (OUTDYN,OBJLINE) WRITE OUT END-FOR ELSE WRITE " " END-IF /* OBJSTART := OBJEND IF OBJSTART GT *LENGTH(xml) ESCAPE BOTTOM END-IF /* EXAMINE SUBSTRING(xml,OBJSTART) FOR H'0A' GIVING POSITION OBJEND END-REPEAT * END
DEFINE DATA PARAMETER 1 EMPLOYEE 2 ATTRIBUTES_OF_EMPLOYEE 3 PERSONNEL-ID(A8) * 2 FULL-NAME 3 FIRST-NAME(A20) 3 NAME(A20) * 2 FULL-ADDRESS 3 C@ADDRESS-LINE(I4) 3 ADDRESS-LINE(A20/1:6) 3 CITY(A20) 3 ZIP(A20) 3 COUNTRY(A3) * 2 TELEPHONE 3 AREA-CODE(A6) 3 PHONE(A15) * 2 JOB-TITLE(A25) * 2 C@INCOME(I4) 2 INCOME(1:6) 3 SALARY(A9) 3 C@BONUS(I4) 3 BONUS(A9/1:4) END-DEFINE
XML ツールキットを使用して、指定の文書型定義を表す Natural データエリア(より正確にはローカルデータエリア、パラメータデータエリア、またはグローバルデータエリア)を生成できます。
生成ルール:
属性を持たない空エレメント(<!ELEMENT br EMPTY>)は、タイプ B1 の Natural 変数として生成されます。 空の Natural グループは許可されないため、このことが必要となります。
属性を持つ空エレメント(<!ELEMENT br EMPTY><!ATTLIST br width CDATA #IMPLIED>)は、Natural グループとして生成されます。
内容を持つ各エレメント(<!ELEMENT b (#PCDATA)>)は、タイプ A253 の Natural 変数として生成されます。
エレメントの連続(<!ELEMENT spec (front, body*, back?)>)またはエレメントの選択(<!ELEMENT div1 (p | list | note)>)は、Natural グループとして生成されます。
連続または選択が組み合わされている場合(<!ELEMENT address ( (street, housenumber), (zip, city) )>)は、名前の接頭辞 "##PSEUDO" が付いた特殊なグループとして生成されます。 これにより、コンテキストまたは可能となる多重度を表現することができます。
エレメントの各属性(<!ATTLIST br width CDATA #IMPLIED>)は、エレメント名に接頭辞 "ATTRIBUTES_OF_" が付いたグループに属する、タイプ A253 の変数として生成されます。
複数のエレメントは、常に次元 1:v の配列として生成されます。 生成される配列の上限は、手動で変更する必要があります。
1 つのエレメントが複数回定義されている場合(<!ELEMENT spec (front, body*)>)は、使用可能なエレメントの数を指定するために、追加のカウンタフィールド C@BODY が生成されます。
Natural 名では大文字と小文字が区別されないため、DTD 内で使用される名前はすべて大文字に変換されます。 生成されたグループ内で重複している名前には、名前が一意になるように接尾辞が付加されます。
Natural 名として無効な特殊文字は変換されて有効な Natural 名になります。 変換の設定については、XML ツールキットのオプションダイアログに関する説明を参照してください。
混在する内容データを持つエレメント(<!ELEMENT p (#PCDATA | a | ul | b | i | em)*>)はサポートされません。
Natural は最大 3 次元のデータ構造のみをサポートするので、Natural データ構造に変換される DTD は Natural 内では使用できません。
<!ELEMENT EMPLOYEE (FULL-NAME , FULL-ADDRESS , TELEPHONE ,JOB-TITLE, INCOME* )> <!ATTLIST EMPLOYEE PERSONNEL-ID CDATA #REQUIRED > <!ELEMENT FULL-NAME (FIRST-NAME , NAME )> <!ELEMENT FIRST-NAME (#PCDATA )> <!ELEMENT NAME (#PCDATA )> <!ELEMENT FULL-ADDRESS (ADDRESS-LINE* , CITY , ZIP , COUNTRY )> <!ELEMENT ADDRESS-LINE (#PCDATA )> <!ELEMENT CITY (#PCDATA )> <!ELEMENT ZIP (#PCDATA )> <!ELEMENT COUNTRY (#PCDATA )> <!ELEMENT TELEPHONE (PHONE , AREA-CODE )> <!ELEMENT PHONE (#PCDATA )> <!ELEMENT AREA-CODE (#PCDATA )> <!ELEMENT JOB-TITLE (#PCDATA )> <!ELEMENT INCOME (SALARY , BONUS* )> <!ELEMENT SALARY (#PCDATA )> <!ELEMENT BONUS (#PCDATA )>
生成された Natural データエリア(DTD の斜体部分。Natural に必須):
DEFINE DATA PARAMETER 1 EMPLOYEE 2ATTRIBUTES_OF_EMPLOYEE 3 PERSONNEL-ID(A253) * 2 FULL-NAME 3 FIRST-NAME(A253) 3 NAME(A253) * 2 FULL-ADDRESS 3C@ADDRESS-LINE(I4) 3 ADDRESS-LINE(A253/1:v) 3 CITY(A253) 3 ZIP(A253) 3 COUNTRY(A253) * 2 TELEPHONE 3 AREA-CODE(A253) 3 PHONE(A253) * 2 JOB-TITLE(A253) * 2C@INCOME(I4) 2 INCOME(1:v) 3 SALARY(A253) 3C@BONUS(I4) 3 BONUS(A253/1:v) END-DEFINE
変換ルール:
Natural | 文書型定義 |
---|---|
1 G1 |
<!ELEMENT G1 (E1)> |
1 G1 |
<!ELEMENT G1 (E1, E2, E3)> |
1 C@E1_MAX (I4) CONST <10> |
|
1 C@E1_MAX (I4) CONST <10> |
|
1 G1 |
<!ELEMENT G1 (E1?)> |
1 G1 |
<!ELEMENT G1 (E1| E2| E3)> |
1 G1 |
<!ELEMENT G1 (E1, E2, G2)> |
1 #G1 |
<!ELEMENT G1 (E1)> |
2 E1 (A…) |
<!ELEMENT E1 (#PCDATA)> |
XML ツールキットを使用して、Natural データエリア(より正確にはローカルデータエリア、パラメータデータエリア、またはグローバルデータエリア)で文書型定義を生成できます。
Natural 変数は、内容を持ったエレメントになります。
Natural グループは、エレメントの連続になります。
複数の変数またはグループは、"0 以上" の多重度で生成されます。
XML 名として無効な特殊文字は変換されて有効な名前になります。 変換設定については、XML ツールキットのオプション画面を参照してください。
Natural データエリアの例:
DEFINE DATA LOCAL 1 NAT$EMPLOYEE 2 ATTRIBUTES_OF_NAT$EMPLOYEE 3 PERSONNEL/ID(A8) 2 C@MAN@WORK(I4) 2 MAN@WORK 3 JOB(A10) 2 A$TEST$MAKL(I4) 2 AS/FA/SD(P7.5) 2 #ASDFAS(F4) 2 ASF#AS(N9) 2 A-SF-D(A) Dynamic 2 INC@OME(1:6) 3 C@BONUS(I4) 3 BONUS(A9/1:4) END-DEFINE
<!-- DTD XMLTOOLS BEISP --> <!ELEMENT NATdollarEMPLOYEE ( MANatWORK , AdollarTESTdollarMAKL , ASslashFAslashSD , hashASDFAS , ASFhashAS , A-SF-D , INCatOME* ) > <!ATTLIST NATdollarEMPLOYEE PERSONNELslashID CDATA #IMPLIED > <!ELEMENT MANatWORK ( JOB ) > <!ELEMENT JOB (#PCDATA) > <!ELEMENT AdollarTESTdollarMAKL (#PCDATA) > <!ELEMENT ASslashFAslashSD (#PCDATA) > <!ELEMENT hashASDFAS (#PCDATA) > <!ELEMENT ASFhashAS (#PCDATA) > <!ELEMENT A-SF-D (#PCDATA) > <!ELEMENT INCatOME ( BONUS* ) > <!ELEMENT BONUS (#PCDATA) >
XML ツールキットを使用して、Natural Simple XML Parser(Natural のシンプルな XML パーサー)で使用するコピーコードを生成できます。
コールバックコピーコードでは、次のオペランドを使用します。
オペランド | フォーマット/長さ | 説明 | PARSER-X から | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A | 要素構造を表す ex-XPATH | オペランド 2 | ||||||||||||||
2 | A1 |
XPATH の内容のタイプ:
|
オペランド 3 | ||||||||||||||
3 | A | 見つかったエレメントの内容 | オペランド 4 | ||||||||||||||
4 | L | 解析されたデータが空の場合、TRUE | オペランド 5 | ||||||||||||||
5 | I4 | カウンタ変数 1 次元 | |||||||||||||||
6 | I4 | カウンタ変数 2 次元 | |||||||||||||||
7 | I4 | カウンタ変数 3 次元 |
* ---------------------------------------------------------------------- * Paremeter Definition * * &1& 'XML_PARSER_XPATH' /* XPATH to repesent element... * &2& 'XML_PARSER_XPATH_TYPE' /* Type of the XPATH: * ? Processing instruction * D DOCTYPE * ! Comment * C CDATA section * T Starting Tag * @ Attribute * / Close Tag * $ Parsed Data * &3& 'XML_PARSER_CONTENT' /* Content of found element * &4& 'XML_PARSER_CONTENT_IS_EMPTY' /* Is TRUE if Content is empty * &5& '#CX' /* Counter Variable 1st Dimension * &6& '#CY' /* Counter Variable 2nd Dimension * &7& '#CZ' /* Counter Variable 3rd Dimension * ---------------------------------------------------------------------- * DECIDE ON FIRST &1& VALUE 'EMPLOYEE' RESET EMPLOYEE VALUE 'EMPLOYEE/@PERSONNEL-ID' /* #REQUIRED EMPLOYEE.PERSONNEL-ID := &3& VALUE 'EMPLOYEE/FULL-NAME' IGNORE VALUE 'EMPLOYEE/FULL-NAME/FIRST-NAME' IGNORE VALUE 'EMPLOYEE/FULL-NAME/FIRST-NAME/$' EMPLOYEE.FIRST-NAME := &3& VALUE 'EMPLOYEE/FULL-NAME/NAME' IGNORE VALUE 'EMPLOYEE/FULL-NAME/NAME/$' EMPLOYEE.NAME := &3& VALUE 'EMPLOYEE/FULL-ADDRESS' IGNORE VALUE 'EMPLOYEE/FULL-ADDRESS/ADDRESS-LINE' /* OPTIONAL MULTIPLE IST: 18 PARENT: FULL-ADDRESS ADD 1 TO EMPLOYEE.C@ADDRESS-LINE VALUE 'EMPLOYEE/FULL-ADDRESS/ADDRESS-LINE/$' &5& := EMPLOYEE.C@ADDRESS-LINE EMPLOYEE.ADDRESS-LINE(&5&) := &3& VALUE 'EMPLOYEE/FULL-ADDRESS/CITY' IGNORE VALUE 'EMPLOYEE/FULL-ADDRESS/CITY/$' EMPLOYEE.CITY := &3& VALUE 'EMPLOYEE/FULL-ADDRESS/ZIP' IGNORE VALUE 'EMPLOYEE/FULL-ADDRESS/ZIP/$' EMPLOYEE.ZIP := &3& VALUE 'EMPLOYEE/FULL-ADDRESS/COUNTRY' IGNORE VALUE 'EMPLOYEE/FULL-ADDRESS/COUNTRY/$' EMPLOYEE.COUNTRY := &3& VALUE 'EMPLOYEE/TELEPHONE' IGNORE VALUE 'EMPLOYEE/TELEPHONE/PHONE' IGNORE VALUE 'EMPLOYEE/TELEPHONE/PHONE/$' EMPLOYEE.PHONE := &3& VALUE 'EMPLOYEE/TELEPHONE/AREA-CODE' IGNORE VALUE 'EMPLOYEE/TELEPHONE/AREA-CODE/$' EMPLOYEE.AREA-CODE := &3& VALUE 'EMPLOYEE/JOB-TITLE' IGNORE VALUE 'EMPLOYEE/JOB-TITLE/$' EMPLOYEE.JOB-TITLE := &3& VALUE 'EMPLOYEE/INCOME' /* OPTIONAL MULTIPLE IST: 18 PARENT: EMPLOYEE ADD 1 TO EMPLOYEE.C@INCOME VALUE 'EMPLOYEE/INCOME/SALARY' IGNORE VALUE 'EMPLOYEE/INCOME/SALARY/$' &5& := EMPLOYEE.C@INCOME EMPLOYEE.SALARY(&5&) := &3& VALUE 'EMPLOYEE/INCOME/BONUS' /* OPTIONAL MULTIPLE IST: 18 PARENT: INCOME &5& := EMPLOYEE.C@INCOME ADD 1 TO EMPLOYEE.C@BONUS(&5&) VALUE 'EMPLOYEE/INCOME/BONUS/$' &5& := EMPLOYEE.C@INCOME &6& := EMPLOYEE.C@BONUS(&5&) EMPLOYEE.BONUS(&5&,&6&) := &3& NONE IGNORE END-DECIDE
* ---------------------------------------------------------------------- * CLASS NATURAL XML TOOLKIT - UTILITIES * * * DESCRIPTION * Parse a given XML document. * * * AUTHOR SAG 01.2006 * * VERSION 6.2. * * (c) Copyright Software AG 2006. All rights reserved. * * ---------------------------------------------------------------------- * DEFINE DATA PARAMETER 1 XML_PARSER_INPUT (A) DYNAMIC PARAMETER USING EMPL PARAMETER 1 XML_PARSER_ERROR_TEXT (A253) 1 XML_PARSER_RESPONSE (I2) * LOCAL USING PARSER-X LOCAL 1 XML_PARSER_XPATH (A) DYNAMIC 1 XML_PARSER_XPATH_TYPE (A1) 1 XML_PARSER_CONTENT (A) DYNAMIC 1 XML_PARSER_CONTENT_IS_EMPTY (L) * LOCAL 1 #CX (I4) 1 #CY (I4) 1 #CZ (I4) END-DEFINE * * ------------------------------------------------- INCLUDE THE PARSER INCLUDE PARSER_X 'XML_PARSER_INPUT' /* XML file to be parsed 'XML_PARSER_XPATH' /* XPATH to repesent element... 'XML_PARSER_XPATH_TYPE' /* Type of callback 'XML_PARSER_CONTENT' /* Content of founld element 'XML_PARSER_CONTENT_IS_EMPTY' /* Is TRUE if element is empty 'XML_PARSER_ERROR_TEXT' /* error Message 'XML_PARSER_RESPONSE' /* Error NR; 0 = OK * * --------------------------------------------------- CALLBACK HANDLER DEFINE SUBROUTINE CALLBACK * INCLUDE EMPL-P 'XML_PARSER_XPATH' /* XPATH to repesent element... 'XML_PARSER_XPATH_TYPE' /* Type of callback 'XML_PARSER_CONTENT' /* Content of founld element 'XML_PARSER_CONTENT_IS_EMPTY' /* Is TRUE if element is empty '#CX' '#CY' '#CZ' * END-SUBROUTINE /* DEFINE SUBROUTINE PARSER_ERROR IGNORE END-SUBROUTINE END
DEFINE DATA PARAMETER 1 EMPLOYEE 2 ATTRIBUTES_OF_EMPLOYEE 3 PERSONNEL-ID(A8) * 2 FULL-NAME 3 FIRST-NAME(A20) 3 NAME(A20) * 2 FULL-ADDRESS 3 C@ADDRESS-LINE(I4) 3 ADDRESS-LINE(A20/1:6) 3 CITY(A20) 3 ZIP(A20) 3 COUNTRY(A3) * 2 TELEPHONE 3 AREA-CODE(A6) 3 PHONE(A15) * 2 JOB-TITLE(A25) * 2 C@INCOME(I4) 2 INCOME(1:6) 3 SALARY(A9) 3 C@BONUS(I4) 3 BONUS(A9/1:4) END-DEFINE