次のトピックについて説明します。
ダイナミック変数を使用する Natural ベースの XML パーサー。
以下の機能。
DTD 定義への Natural データ構造の変換
Natural データ構造を XML ドキュメントとして保存するための COMPRESS ステートメントの生成
Natural ベースのパーサーに対するコールバックの生成
Natural XML ツールキットの目的は、Natural に追加の XML 機能を提供し、Natural アプリケーションと XML の親和性を改善することです。
Natural XML ツールキットは、Natural プラグインとして実装されています。 XML ツールキットプログラムを顧客のアプリケーションに統合して、XML データへのアクセスを可能にしたり、Natural からデータを XML フォーマットで提供したりすることができます。
Natural XML ツールキットは、次の機能を呼び出します。
XML ツールキット機能
Natural データ定義と DTD または XML スキーマの間のマッピング
XML トークンから NAT への変換
Natural データ構造を作成した後、XML ドキュメントを解析してデータ構造に保存する必要があります。 所定のデータを Natural データ構造に保存できる Natural 実装が生成されます。
NAT データから XMLドキュメントへの変換("シリアライズ")
シリアライズとは、Natural データ構造に保存されたデータを取り出し、指定された記述に従って XML ドキュメントを作成する処理です。
Natural ダイアログは XML ツールキット機能へのユーザーインターフェイスを実装しています。 DTD または XML スキーマはワークファイルとしてアクセスされ、生成された Natural オブジェクトは Natural システムファイルに直接保存されます。
このマッピングは、Natural データ構造を XML タグと結合するための最初の手順であり、XML タグとして Natural データを表現するために必要です。 以下の例は、Natural と DTD の間のマッピングといくつかの明確な違いを示しています。
Press ESC to enter command mode Mem: EMPL Lib: SYSXTK Type: PARAMETER Bytes: 1072 Line: 0 of: 26 C T Comment * *** Top of Data Area *** 1 EMPLOYEE 2 ATTRIBUTES_OF_EMPLOYEE 3 PERSONNEL-ID A 8 * 2 FULL-NAME 3 FIRST-NAME A 20 3 NAME A 20 * 2 FULL-ADDRESS 3 C@ADDRESS-LINE I 4 3 ADDRESS-LINE A 20 (1:6) 3 CITY A 20 3 ZIP A 20 3 COUNTRY A 3 * 2 TELEPHONE 3 AREA-CODE A 6 3 PHONE A 15 |
生成された DTD
<!ELEMENT EMPLOYEE (PERSONNEL-ID, FULL-NAME, FULL-ADDRESS, TELEPHONE, INCOME* )> <!ELEMENT PERSONNEL-ID (#PCDATA ) > <!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 )> ...
生成された DTDは、後で XML ドキュメントへのシリアライズで使用されます(下記参照)。
Natural プログラムの実行中、DEFINE DATA ステートメントに定義されたデータの内容は、"実際" の内容で埋められます。 この内容は、シリアライズ中に XML フォーマットでダイナミック変数に書き込まれ、以前に生成された DTD を入力として使用します。
XML ツールキットは、データをシリアライズするプログラムを生成します。
<?xml version="1.0" encoding="iso-8859-1" ?> <EMPLOYEE PERSONNEL-ID="30016509"> <FULL-NAME> <FIRST-NAME>ELSPETH</FIRST-NAME> <NAME>TROWBRIDGE</NAME> </FULL-NAME> <FULL-ADDRESS> <ADDRESS-LINE>91 BACK LANE</ADDRESS-LINE> <ADDRESS-LINE>BILSTON</ADDRESS-LINE> <ADDRESS-LINE>STAFFORDSHIRE</ADDRESS-LINE> <CITY>BILSTON</CITY> <ZIP>ST2 3KA</ZIP> <COUNTRY>UK</COUNTRY> </FULL-ADDRESS> <TELEPHONE> <PHONE>863322</PHONE> <AREA-CODE>0602</AREA-CODE> </TELEPHONE> ...
Natural データ構造への DTD のマッピングについて、もう一度違いを示します。 DTD では XML ドキュメントに何人分のレコードが含まれるかを指定しないので、ツールキットで最大 "v" 人分のレコードが含まれることを想定します。 アプリケーションプログラマが正確な数を把握すれば、データ構造を修正できます。 同じような制限がデータ長にも存在します。 DTD には、各レコードのデータ長に関する情報が含まれていません。 このため、ツールキットで、データ構造に長さ (A) DYNAMIC(現在の最大長)のフィールドを作成します。
* DTD E:\SAG\nat\6.3\fnat\SYSXTK\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 ...
* DTD E:\SAG\nat\6.3\fnat\SYSXTK\RES\empl.dtd DECIDE ON FIRST &1& VALUE 'EMPLOYEE' RESET INITIAL 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& ...
XML ツールキットは、完全にアセンブルされた XML スキーマ(レイヤ 1)のみをサポートします。 詳細については、XML スキーマ(レイヤ 1)に関する W3C 勧告(英語)を参照してください。
XML ツールキットを使用する場合は、その他に次の制限を考慮する必要があります。
データ構造のデータフィールドおよびグループの数が約 700 を超えた場合は、以下のメッセージが表示されます。
Input Structure too big
データ構造をより小さいセクションに分割してください。
次の制限は、ソースデータに配列が含まれている場合に、Natural データエリアから XML ドキュメントを生成するときに適用されます。
各配列では厳密に 1 次元配列のみ使用できます。
各レベルでは厳密に 1 次元のみ追加できます。
各配列にはカウンタ変数が必要です。
カウンタ変数には以下の制限があります。
カウンタ変数は配列の前に配置する必要があります。
カウンタ変数名は、先頭が文字 C で、それにカウンタセパレータフィールドを続けた名前にする必要があります。
配列の *LBOUND(下限)は 1 にする必要があります。
ターゲット名前空間が同じ複数のスキーマをドキュメントに追加します。 ドキュメントは一切の変更なしにインクルードされる必要があります。
ターゲット名前空間が異なる複数のスキーマをドキュメントに追加します。 まず、インポートするドキュメントで名前空間接の頭辞を変換する必要があります。その後、ドキュメントをインクルードできます。
特定の単一または複合タイプ、グループ、および属性グループを外部スキーマから選択することで、元の仕様を必要に応じて変更できます。
注意:
上記の要素を使用する場合は、相対 URI のみ使用できます。 絶対 URI(例: http://www.yourdomain.com/your/path または file://your/path)は使用できません。
外部データをドキュメントにインクルードする必要があります。 変換は必要ありません。
<![ INCLUDE ]
が見つかった場合は、そこに含まれる定義が生成に使用されます。
<![ IGNORE ]
が見つかった場合は、そこに含まれる定義は生成に使用されません。
XML ツールキットでは、次の 2 種類のワイルドカード表現がサポートされています。
後続の要素をすべて保存する
指定されていないすべての属性を保存する
ワイルドカードサポートには、次のルールと制限が適用されます。
属性の場合は、attributes_of_<entity-name>
グループが生成されます。 このグループに接続されているすべての属性が追加されます。 属性の名前は変数名として保存され、内容は変数の内容になります。
<any>
属性を追加するには、指定されていないすべての属性を含む変数を追加する必要があります。
注意:
<any>
属性は、"実際の" 属性ではありません。解析されないデータのコンテナとして使用され、属性/値のペアが含まれます。 <any>
属性は、タイプ (A) DYNAMIC の ##ANY
変数によって表されます。
このデータにアクセスする必要がある場合があるため、##ANY
の後に一般的な数字を付けるだけではなく、より具体的な名前を使用する必要があります。 親エンティティの名前とキーワード ATTR
または ATTRIBUTE
を追加することをお勧めします。 以下の例を参照してください。
1 HTML 2 BODY 3 ATTRIBUTES_OF_BODY 4 BGCOLOR (A) DYNAMIC 4 ##ANY_ATTR_BODY (A) DYNAMIC
解析中に XML スキーマ内に名前のない属性が見つかった場合は、変数名と値は all_attributes_of_<element-name>
グループにそのまま(標準 XML 構文で)保存されます。
<attribute-name1>="<attribute-value1>" <attribute-name2>="<attribute-value2>"
など
シリアライズ時に上記の文字列が追加されます。
<any>
データタイプを追加するには、エンティティの名前と値に関係なく、エンティティの後続のすべてのデータを保存する必要があります。
注意:
<any>
エンティティは "実際の" エンティティを表してはいません。解析されないデータのコンテナとして使用され、エンティティとその内容全体(属性など)が含まれます。 <any>
エンティティは、タイプ (A) DYNAMIC の ##ANY
変数によって表されます。
このデータにアクセスする必要がある場合があるため、##ANY
の後に一般的な数字を付けるだけではなく、より具体的な名前を使用する必要があります。 親エンティティの名前を追加することをお勧めします。 以下の例を参照してください。
1 HTML 2 BODY 3 ATTRIBUTES_OF_BODY 4 BGCOLOR (A) DYNAMIC 4 ##ANY_ATTR_BODY (A) DYNAMIC 3 ##ANY_BODY (A) DYNAMIC
解析中にタイプ <any>
の要素が見つかった場合は、後続のすべてのデータが収集されます。
シリアライズ時に、すべてのデータは変更なしに取り出され、結果の XML ドキュメントに追加されます。
xs:any
の属性 "maxOccurs"
または "minOccurs"
が指定された場合でも、xs:any
を実装する Natural 変数は常にスカラーになります。 この Natural 変数には複数のエンティティのデータが含まれることがあります。
xs:any
の属性 "namespace"
は評価されず、xs:any
を実装する Natural 変数に複数の名前空間のエンティティが含まれることがあります。
使用されるパーサーは検証を行わないため、xs:any
の属性 "processContents"
は評価されません。
解析中に複数の <any>
コンテナを認識することはできないため、xs:choice
または xs:sequence
に xs:any
の定義が複数含まれていると生成に失敗します。
XML スキーマで指定されていないエンティティがドキュメントに含まれており、同じレベルに xs:any
が定義されている場合は、xs:any
を実装する Natural 変数にこの "無指定の" エンティティデータが含まれることがあります。
外部データ構造の生成中、##ANY
が前置された各変数は特定のワイルドカード機能に変換されます。
##ANY_
:any エンティティタイプ。 DTD と XML スキーマに適用されます。
##ANY_ATTR_
:any 属性タイプ。 XML スキーマのみに適用されます。