PARSE XML

PARSE XML operand1 [INTO [PATH operand2] [NAME operand3] [VALUE operand4]]
  [[NORMALIZE] NAMESPACEoperand5 PREFIXoperand6]
statement...
END-PARSE (structured mode only)
LOOP (reporting mode only)

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント: REQUEST DOCUMENT

関連機能グループ:インターネットと XML


関数

PARSE XML ステートメントを使用すると、Natural プログラムから XML ドキュメントを解析できるようになります。『プログラミングガイド』の「インターネットおよび XML アクセス用のステートメント」も参照してください。

スタティック変数の長さを決定することはできないため、PARSE ステートメントを使用するときはダイナミック変数を使用することをお勧めします。スタティック変数を使用すると、変数に書き込まれる値が切り捨てられる可能性があります。

Unicode サポートの詳細については、『Unicode およびコードページのサポート』ドキュメントの「PARSE XML」を参照してください。

マークアップ

(ASCII ベースシステムで)XML ドキュメントの異なるデータタイプを表すためにパス文字列で使用されるマーキングを次に示します。

マーキング XML データ パス文字列内の位置
? 処理命令(<?XML...?> を除く) 末尾
! コメント 末尾
C CDATA セクション 末尾
@ 属性(メインフレームではセッションコードページおよび端末エミュレーションにより、§ または @) 属性名の前
/ 終了タグまたはパス内の親名セパレータ 末尾または親名の間
$ 解析したデータ - データ文字列 末尾

パス文字列でこの追加のマークアップを使用することにより、出力ドキュメントで XML ドキュメントの各種要素をより容易に識別できます。

グローバル名前空間

グローバル名前空間を指定するには、接頭辞としてのコロン(:)および空の URI を使用してください。

関連するシステム変数

次の Natural システム変数は、発行された PARSE XML ステートメントごとに自動的に作成されます。

*PARSE-TYPE*PARSE-LEVEL*PARSE-ROW*PARSE-COL および *PARSE-NAMESPACE-URI の後の表記 (r)PARSE を発行したステートメントのラベルまたはステートメント番号を示します。(r) 指定がない場合、対応するシステム変数は、アクティブな PARSE 処理ループで現在処理されている XML データのシステム変数を表します。

これらのシステム変数の詳細については、『システム変数』ドキュメントを参照してください。

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S       A U B                     ×
operand2   S       A U B                    
operand3   S       A U B                    
operand4   S       A U B                    
operand5   S A     A U B                    
operand6   S A     A U B                    

構文要素の説明:

構文要素 説明
operand1
XML ドキュメント:
operand1 は対象の XML ドキュメントを表します。XML ドキュメントを解析中に変更することはできません。解析中に XML ドキュメントを変更(例えば、書き込み)しようとすると、エラーメッセージが表示されます。
operand2
パス:

operand2 は XML ドキュメントのデータの PATH を表します。

PATH には、識別された XML 部分の名前、すべての親の名前、および XML 部分のタイプが含まれます。

注意:
PATH で指定された情報を使用して、ツリービューを容易に満たすことができます。

例 1 - operand2 の使用」も参照してください。

operand3
データ要素名:

operand3 は XML ドキュメントのデータ要素の NAME を表します。

NAME が値を持たない場合、それに関連するダイナミック変数は *length()=0(空白で満たされたスタティック変数)に設定されます。

例 2 - operand3 の使用」も参照してください。

operand4
データ要素の内容:

operand4 は XML ドキュメントのデータ要素の内容(VALUE)を表します。

値がない場合、所定のダイナミック変数は *length()=0,(空白で満たされたスタティック変数)に設定されます。

例 3 - operand4 の使用」も参照してください。

operand5 およびoperand6

NORMALIZE NAMESPACE

PREFIX

名前空間 URI および接頭辞:

NAMESPACE URI または URI(operand5)および名前空間 PREFIXoperand6)はランタイム中にコピーされます。したがって、PARSE XML ループ内の名前空間マッピング配列の修正はパーサに影響しません。

operand5 およびoperand6 はオカレンス数の等しい 1 次元配列です。

名前空間正規化は PARSE ステートメントの機能です。XML では、要素名に対応する名前空間を定義できます。

<myns:myentity xmlns:myns="http://myuri" />

NAMESPACE 定義は次の部分で構成されます。

  • 名前空間 PREFIX(この場合、myns

  • 名前空間を定義する URI(myuri

名前空間 PREFIX は要素名の一部です。つまり、PARSE ステートメントに対して、そして特に operand2 に対して、生成された PATH 文字列は名前空間 PREFIX に依存します。Natural プログラム内のパスが特定のタグを示すために使用される場合、XML ドキュメントで正しい NAMESPACE(URI)を異なる PREFIX とともに使用すると失敗します。

名前空間正規化では、すべての名前空間 PREFIX は、NAMESPACE 節で定義されているデフォルト値に設定できます。最初のエントリは、URI が複数回指定される場合に使用されます。XML ドキュメントで複数の PREFIX が使用される場合、最初のものだけが出力に考慮されます。残りは無視されます。

NAMESPACE 節には、名前空間 URI と接頭辞のペアが含まれます。例えば、次のようになります。

uri(1) := 'http://namespaces.softwareag.com/natural/demo'
pre(1) := 'nat:'

XML ドキュメント内に NAMESPACE が定義されている場合、パーサによってその名前空間(URI)が正規化テーブルに存在するかどうかがチェックされます。正規化テーブルの接頭辞は、XML ドキュメントに定義された名前空間の代わりに、PARSE ステートメントからのすべての出力データに対して使用されます。

以下の項目も参照してください。

PREFIX に関する追加情報:

また、接頭辞定義には次の点が適用されます。

  • 名前空間正規化配列の接頭辞定義は、置換される文字列であるため、常にコロン(:)で終了する必要があります。

  • PREFIX または URI は、名前空間正規化配列には 1 回だけ存在できます。

  • PREFIX または NAMESPACE URI に末尾の空白が含まれる場合(例えば、スタティック変数の使用時)、外部パーサが呼び出される前に、末尾の空白は削除されます。

  • 名前空間正規化での PREFIX の定義にコロン(:)のみが含まれている場合、NAMESPACE PREFIX はコロン(:)に変換されます。

  • 名前空間正規化での PREFIX の定義が空の場合、NAMESPACE PREFIX は削除されます。

END-PARSE
PARSE XML ステートメントの終了:

ストラクチャードモードの場合、Natural の予約キーワード END-PARSE を使用して PARSE XML ステートメントを終了させる必要があります。

レポーティングモードでは、Natural のステートメント LOOP を使用して PARSE XML ステートメントを終了します。

LOOP

例 1 - operand2 の使用

次のような XML コードがあるとします。

myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-
         '<employee personnel-id="30016315" >'-
         '<full-name>'-
         '<!--this is just a comment-->'-
         '<first-name>RICHARD</first-name>'-
         '<name>FORDHAM</name>'-
         '</full-name>'-
         '</employee>'

これは、次の Natural コードで処理されます。

PARSE XML myxml INTO PATH mypath
  PRINT mypath
END-PARSE

次の出力を生成します。

employee
employee/@personnel-id
employee/full-name
employee/full-name/!
employee/full-name/first-name
employee/full-name/first-name/$
employee/full-name/first-name//
employee/full-name/name
employee/full-name/name/$
employee/full-name/name//
employee/full-name//
employee//

例 2 - operand3 の使用

次のような XML コードがあるとします。

myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-  
         '<employee personnel-id="30016315" >'-
         '<full-name>'-
         '<!--this is just a comment-->'-
         '<first-name>RICHARD</first-name>'-
         '<name>FORDHAM</name>'-
         '</full-name>'-
         '</employee>'

これは、次の Natural コードで処理されます。

PARSE XML myxml INTO PATH mypath NAME myname
  DISPLAY (AL=39) mypath myname
END-PARSE

注意:
次の出力を生成します。

               MYPATH                                MYNAME
----------------------------------    -----------------------------------


employee                              employee
employee/@personnel-id                personnel-id
employee/full-name                    full-name
employee/full-name/!
employee/full-name/first-name         first-name
employee/full-name/first-name/$
employee/full-name/first-name//       first-name 
employee/full-name/name               name
employee/full-name/name/$
employee/full-name/name//             name
employee/full-name//                  full-name
employee//                            employee

例 3 - operand4 の使用

次のような XML コードがあるとします。

myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-  
         '<employee personnel-id="30016315" >'-
         '<full-name>'-
         '<!--this is just a comment-->'-
         '<first-name>RICHARD</first-name>'-
         '<name>FORDHAM</name>'-
         '</full-name>'-
         '</employee>'

これは、次の Natural コードで処理されます。

PARSE XML myxml INTO PATH mypath VALUE myvalue
  DISPLAY (AL=39) mypath myvalue
END-PARSE

次の出力を生成します。

               MYPATH                                MYVALUE
----------------------------------    -----------------------------------


employee
employee/@personnel-id                30016315
employee/full-name
employee/full-name/!                  this is just a comment
employee/full-name/first-name
employee/full-name/first-name/$       RICHARD
employee/full-name/first-name//
employee/full-name/name
employee/full-name/name/$             FORDHAM
employee/full-name/name//
employee/full-name//
employee//

例 4 - operand5operand6 の使用

次のような XML コードがあるとします。

myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-
         '<nat:employee nat:personnel-id="30016315"'-
         ' xmlns:nat="http://namespaces.softwareag.com/natural/demo">'-
         '<nat:full-Name>'-
         '<nat:first-name>RICHARD</nat:first-name>'-
         '<nat:name>FORDHAM</nat:name>'-
         '</nat:full-Name>'-
         '</nat:employee>'

これは、次の Natural コードで処理されます。

PARSE XML myxml INTO PATH mypath
  PRINT mypath
END-PARSE

次の出力を生成します。

nat:employee
nat:employee/@nat:personnel-id
nat:employee/@xmlns:nat
nat:employee/nat:full-Name
nat:employee/nat:full-Name/nat:first-name
nat:employee/nat:full-Name/nat:first-name/$  
nat:employee/nat:full-Name/nat:first-name//
nat:employee/nat:full-Name/nat:name
nat:employee/nat:full-Name/nat:name/$
nat:employee/nat:full-Name/nat:name//
nat:employee/nat:full-Name//
nat:employee//

例 5 - 名前空間正規化での operand5operand6 の使用

NORMALIZE NAMESPACE を使用すると、例 4 のような NAMESPACE PREFIX の異なる同じ XML ドキュメントでまったく同じ出力が生成されます。

XML コード:

myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-
         '<natural:employee natural:personnel-id="30016315"'-
         ' xmlns:natural="http://namespaces.softwareag.com/natural/demo">'-  
         '<natural:full-Name>'-
         '<natural:first-name>RICHARD</natural:first-name>'-
         '<natural:name>FORDHAM</natural:name>'-
         '</natural:full-Name>'-
         '</natural:employee>'

Natural コード:

uri(1) := 'http://namespaces.softwareag.com/natural/demo'
pre(1) := 'nat:'
*
PARSE XML myxml INTO PATH mypath NORMALIZE NAMESPACE uri(*) PREFIX pre(*)  
  PRINT mypath
END-PARSE

上記プログラムの出力:

nat:employee
nat:employee/@nat:personnel-id
nat:employee/@xmlns:nat
nat:employee/nat:full-Name
nat:employee/nat:full-Name/nat:first-name
nat:employee/nat:full-Name/nat:first-name/$  
nat:employee/nat:full-Name/nat:first-name//
nat:employee/nat:full-Name/nat:name
nat:employee/nat:full-Name/nat:name/$
nat:employee/nat:full-Name/nat:name//
nat:employee/nat:full-Name//
nat:employee//