はじめに

次のトピックについて説明します。


XML ツールキットの特徴

  • ダイナミック変数を使用する、Natural ベースの XML パーサー。

  • 以下の機能があります。

    • Natural データ構造の DTD 定義への変換

    • Natural データ構造を XML ドキュメントとして保存するための COMPRESS ステートメントの生成

    • Natural ベースのパーサーに対するコールバックの生成

XML ツールキットの説明

目的

Natural XML ツールキットでは、Natural に追加の XML 機能を提供し、Natural アプリケーションと XML の統合を強化します。

一般的なアーキテクチャ

Natural XML ツールキットは、Natural プログラムの集合で構成されています。 XML ツールキットプログラムを顧客のアプリケーションに統合すると、XML データへのアクセスを可能にしたり、XML フォーマットのデータを Natural から提供したりできます。

Natural XML ツールキットでは、次の機能を呼び出します。

XML ツールキットの機能

  1. Natural データ定義と DTD の間のマッピング

  2. XML トークンから NAT データへの変換
    Natural データ構造を作成した後、XML ドキュメントを解析してそのデータ構造に保存する必要があります。 指定したデータを Natural データ構造に保存できる Natural の実装が生成されます。

  3. NAT データから XML ドキュメントへの変換(シリアライズ)
    シリアライズとは、Natural データ構造に保存されたデータを取得し、指定された記述に従って XML ドキュメントを作成する処理のことです。

XML ツールキット機能へのユーザーインターフェイスは、Natural ダイアログによって実装されます。 DTD はワークファイルとしてアクセスされ、生成された Natural オブジェクトは Natural システムファイルに直接保存されます。

Natural データ定義の DTD へのマップ

このマッピングは、Natural データ構造を XML タグと結合するための最初の手順であり、Natural データを XML タグとして表現するために必要となります。 以下の例は、Natural と DTD の間のマッピング、およびいくつかの明確な違いを示しています。

Natural PDA

                       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 ドキュメントへのシリアライズに使用されます(下記参照)。

データの 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>
...

DTD の Natural データ定義へのマップ

DTD の Natural データ構造へのマッピングにも、違いがあります。 DTD では XML ドキュメントに何人分のレコードが含まれるかを指定しないため、ツールキットでは、最大 "v" 人分のレコードが含まれることを想定します。 アプリケーションプログラマは、正確な数を把握すれば、この数に合わせてデータ構造を修正できます。 同じような制限がデータ長にも存在します。 DTD では、各人のレコードにデータ長に関する情報が含まれていません。 このため、ツールキットで、データ構造に長さ 253(現在の最大長)のフィールドを作成します。

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

XML ファイルの解析および Natural データへの割り当て

* 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 ツールキットによって、Natural で XML がより高度にサポートされるようになりました。 XML ツールキットは、最初にリリースされた後、拡張される可能性があります。 ただし、主な目標は、将来のリリースにおいて Natural の強力な言語の一部として XML 機能を実装することです。

考慮事項と制限事項

XML ツールキットでは、完全にアセンブルされた XML スキーマ(レイヤ 1)のみがサポートされています。 詳細については、XML スキーマ(レイヤ 1)に関する W3C 勧告を参照してください。

XML ツールキットを使用する場合は、その他に次の制限を考慮する必要があります。

非常に大きなデータ構造

データ構造のデータフィールドおよびグループの数が約 700 を超えた場合は、次のメッセージが表示されます。

Input Structure too big

解決策

データ構造をより小さいセクションに分割します。

XML スキーマ:アクセスと構成

<include>

ターゲット名前空間が同じ複数のスキーマを、ドキュメントに追加します。 ドキュメントは一切の変更なしにインクルードされる必要があります。

<import>

ターゲット名前空間が異なる複数のスキーマを、ドキュメントに追加します。 まず、インポートの対象となるドキュメントで、名前空間の接頭辞を変換する必要があります。その後、ドキュメントにインクルードできます。

<redefine>

特定の、単一または複合タイプ、グループ、および属性グループを外部スキーマから選択することで、必要に応じて元の仕様を変更できます。

注意:
上記の要素を使用する場合、相対 URI のみ使用できます。 絶対 URI(例: http://www.yourdomain.com/your/path または file://your/path)は使用できません。

DTD:外部解析データの追加

外部データをドキュメントにインクルードする必要があります。 変換は必要ありません。

条件付きの DTD

<![ INCLUDE ] が見つかった場合は、そこに含まれる定義が生成に使用されます。

<![ IGNORE ] が見つかった場合は、そこに含まれる定義は生成に使用されません。

ワイルドカード

XML ツールキットでは、次の 2 種類のワイルドカード表現がサポートされています。

  • 後続の要素をすべて保存

  • 指定されていないすべての属性を保存

ワイルドカードサポートには、次のルールと制限が適用されます。

XML スキーマ <anyAttribute>

属性に対しては 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>" などです。

シリアライズ時に、上記の文字列が追加されます。

XML スキーマ <any> または DTD <!ELEMENT element-name ANY>

<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 の制限

xs:any の属性 "maxOccurs" および/または "minOccurs" が指定された場合でも、xs:any を実装する Natural 変数は常にスカラーになります。 Natural 変数には複数のエンティティのデータが含まれることがあります。

xs:any の属性 "namespace" は評価されず、xs:any を実装する Natural 変数に複数の名前空間のエンティティが含まれることがあります。

使用されるパーサーは検証を行わないため、xs:any の属性 "processContents" も評価されません。

ですから、xs:choice または xs:sequencexs:any の定義が複数含まれていると、生成は失敗します。これは、解析中に複数の <any> コンテナを認識できないためです。

XML スキーマで指定されていないエンティティがドキュメントに含まれており、同じレベルに xs:any が定義されている場合は、xs:any を実装する Natural 変数に、この "無指定の" エンティティデータが含まれることがあります。

Natural:##ANY ワイルドカードを含む XML スキーマ または DTD の生成

外部データ構造の生成中、##ANY を接頭辞とする各変数は特定のワイルドカード機能に変換されます。

  • ##ANY_:any エンティティタイプ。 DTD と XML スキーマに適用されます。

  • ##ANY_ATTR_:any 属性タイプ。 XML スキーマのみに適用されます。