次の例が含まれています。


コピーコードのシリアライズ

XML ツールキットを使用して、Natural グループ構造を XML ドキュメントに変換するコピーコードを生成できます。

コールバックコピーコードでは、次のオペランドを使用します。

オペランド フォーマット/長さ 説明 PARSER-X から
1 A 要素構造を表す ex-XPATH オペランド 2
2 A1

XPATH の内容のタイプ:

? 処理命令
D DOCTYPE
! コメント
C CDATA セクション
T 開始タグ
@ 属性
/ 終了タグ
オペランド 3
3 A 解析されたデータ オペランド 4
4 L 解析されたデータが空の場合、TRUE オペランド 5
5 I4 カウンタ変数 1 次元  
6 I4 カウンタ変数 2 次元  
7 I4 カウンタ変数 3 次元  

コピーコード EMPL-C の例:

* 
---------------------------------------------------------------------- * 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 

使用した Natural PDA EMPL:

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 

生成された Natural データエリア

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 内では使用できません。

DTD の例:

<!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 DTD パーサー

変換ルール:

Natural 文書型定義

1 G1
2 E1 (A…)

<!ELEMENT G1 (E1)>
<!ELEMENT E1 (#PCDATA)>

1 G1
2 E1 (A…)
2 E2 (A…)
2 E3 (A…)

<!ELEMENT G1 (E1, E2, E3)>
<!ELEMENT E1 (#PCDATA)>
<!ELEMENT E2 (#PCDATA)>
<!ELEMENT E3 (#PCDATA)>

1 C@E1_MAX (I4) CONST <10>
1 G1
2 C@E1 (I4)
2 E1 (A…/1:C@E1_MAX)


<!ELEMENT G1 (E1*)>

<!ELEMENT E1 (#PCDATA)>

1 C@E1_MAX (I4) CONST <10>
1 G1
2 C@E1 (I4)
2 E1 (A…/1:C@E1_MAX)


<!ELEMENT G1 (E1+)>

<!ELEMENT E1 (#PCDATA)>

1 G1
2 E1 (A…)

<!ELEMENT G1 (E1?)>
<!ELEMENT E1 (#PCDATA)>

1 G1
2 E1 (A…)
2 E2 (A…)
2 E3 (A…)

<!ELEMENT G1 (E1| E2| E3)>
<!ELEMENT E1 (#PCDATA)>
<!ELEMENT E2 (#PCDATA)>
<!ELEMENT E3 (#PCDATA)>

1 G1
2 E1 (A…)
2 E2 (A…)
2 G2
2 E1_2 (A…)
2 E3 (A…)

<!ELEMENT G1 (E1, E2, G2)>
<!ELEMENT E1 (#PCDATA)>
<!ELEMENT E2 (#PCDATA)>
<!ELEMENT G2 (E1, E3)>

<!ELEMENT E3 (#PCDATA)>

1 #G1
2 #E1 (A…)

<!ELEMENT G1 (E1)>
<!ELEMENT E1 (#PCDATA)>

2 E1 (A…)
3 ATTRIBUTES_OF_E1
4 A1 (A…) CONST <'schema'>
4 A2 (A…)
4 A3 (A…)

<!ELEMENT E1 (#PCDATA)>

<!ATTLIST E1 A1 #FIXED "schema"
A2 NMTOKEN #IMPLIED
A3 ID #REQUIRED>

生成されたタイプ定義

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

<!-- 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) >

パーサー CALLBACK コピーコード

XML ツールキットを使用して、Natural Simple XML Parser(Natural のシンプルな XML パーサー)で使用するコピーコードを生成できます。

コールバックコピーコードでは、次のオペランドを使用します。

オペランド フォーマット/長さ 説明 PARSER-X から
1 A 要素構造を表す ex-XPATH オペランド 2
2 A1

XPATH の内容のタイプ:

? 処理命令
D DOCTYPE
! コメント
C CDATA セクション
T 開始タグ
@ 属性
/ 終了タグ
オペランド 3
3 A 見つかったエレメントの内容 オペランド 4
4 L 解析されたデータが空の場合、TRUE オペランド 5
5 I4 カウンタ変数 1 次元  
6 I4 カウンタ変数 2 次元  
7 I4 カウンタ変数 3 次元  

コピーコード EMPL-P の例:

* ----------------------------------------------------------------------
* 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

使用した Natural PDA EMPL:

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