バージョン 6.3.3
 —  Web テクノロジ  —

はじめに

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


XML ツールキットの特徴

Top of page

XML ツールキットの説明

目的

Natural XML ツールキットの目的は、Natural に追加の XML 機能を提供し、Natural アプリケーションと XML の親和性を改善することです。

一般的なアーキテクチャ

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

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

XML ツールキット機能

  1. Natural データ定義と DTD または XML スキーマの間のマッピング

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

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

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

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

このマッピングは、Natural データ構造を XML タグと結合するための最初の手順であり、XML タグとして Natural データを表現するために必要です。 以下の例は、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>
...

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

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

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&

...

Top of page

考慮事項と制限事項

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

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

非常に大きなデータ構造

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

Input Structure too big

解決策

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

多次元配列

次の制限は、ソースデータに配列が含まれている場合に、Natural データエリアから XML ドキュメントを生成するときに適用されます。

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" は評価されません。

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

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

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

外部データ構造の生成中、##ANY が前置された各変数は特定のワイルドカード機能に変換されます。

Top of page