XML パーサーの制限
- RPG 文字変数の長さは 16773104 バイトのみです。 プログラムが それよりも長い XML データへのポインターを持つ場合 (例えば MQSeries®® 呼び出しから)、統合ファイル・システムの一時ファイルに XML データを書き込んで、一時ファイルから XML データを構文解析する必要があります。これを行うサンプル・プロシージャーについては、図 1 を参照してください。
- 構文解析が 1 バイト文字 CCSID で実行される場合、パーサーが処理できる最大文字数は、2147483408 です。
- 構文解析が UCS-2 で実行される場合、パーサーが処理できる最大 UCS-2 文字数は、1073741704 です。
- パーサーは、すべての CCSID をサポートするわけではありません。ジョブの CCSID が、パーサーが処理しない CCSID のいずれかである場合、文書を UCS-2 で構文解析する必要があります。
- 1047、37、1140、273、1141、277、1142、278、1143、280、1144、284、1145、 285、1146、297、1147、500、1148、871、および 1149 の EBCDIC CCSID はサポートされます。
- 819、813、920 の ASCII CCSID はサポートされます。
- 1200、13488、17584 の Unicode CCSID はサポートされます。
パーサーでは、5 つの事前定義の参照 (&、&apos、>、<、および ") 以外のエンティティー参照はサポートされません。パーサーが不明なエンティティー参照を検出した場合、「不明参照」イベントまたは「不明属性参照」イベントのいずれかを生成します。イベントの値は、形式 "&name;" の参照です。
- パーサーは、DOCTYPE 宣言を構文解析しません。 DOCTYPE 宣言のテキストは、"DOCTYPE 宣言" イベント用のデータ値として渡されます。
- パーサーは、名前空間をサポートしません。XML 要素および属性名のコロンを無視します。
- パーサーは、"接頭部マッピングの開始" および "接頭部マッピングの終了" イベントを生成しません。XML 要素および属性名のコロンを無視します。
図 1. 統合ファイル・システムのファイルへのデータの書き込み
* Parameters:
* 1. path : a pointer to a null-terminated string containing
* the path to the file to be written
* 2. dataPtr : a pointer to the data to be written
* 3. dataLen : the length of the data in bytes
* 4. dataCcsid : the CCSID of the data
* 5. fileCcsid : the desired CCSID of the file
* Sample RPG coding:
* ifsWrite ('/home/mydir/temp.xml' : xmlPtr : xmlLen : 37 : 37);
* xml-into ds %xml('/home/mydir/temp.xml' : 'doc=file');
* To delete the file, use the system command
* rmvlnk '/home/mydir/temp.xml'
* Note: This module requires BNDDIR(QC2LE)
P ifsWrite B EXPORT
D ifsWrite PI
D path * VALUE OPTIONS(*STRING)
D dataPtr * VALUE
D dataLen 10I 0 VALUE
D dataCcsid 10I 0 VALUE
D fileCcsid 10I 0 VALUE
D O_CREAT C x'00000008'
D O_TRUNC C x'00000040'
D O_WRONLY C x'00000002'
D O_RDWR C x'00000004'
D O_CCSID C x'00000020'
D O_TEXT_CREAT C x'02000000'
D O_TEXTDATA C x'01000000'
D O_SHARE_NONE C x'00080000'
D S_IRUSR C x'0100'
D S_IROTH C x'0004'
D S_IRGRP C x'0020'
D S_IWUSR C x'0080'
D S_IWOTH C x'0002'
D ssize_t S 10I 0
D size_t S 10U 0
D open PR 10I 0 EXTPROC('open')
D path * VALUE OPTIONS(*STRING)
D flag 10I 0 VALUE
D mode 10I 0 VALUE
D fileCcsid 10I 0 VALUE options(*nopass)
D dataCcsid 10I 0 VALUE options(*nopass)
D writeFile PR LIKE(ssize_t)
D EXTPROC('write')
D handle 10I 0 VALUE
D data * VALUE
D len VALUE LIKE(size_t)
D closeFile PR 10I 0 EXTPROC('close')
D handle 10I 0 VALUE
D oflag S 10I 0
D omode S 10I 0
D handle S 10I 0
D rc S 10I 0
D sysErrno PR * EXTPROC('__errno')
D errno S 10I 0 BASED(pErrno)
/FREE
pErrno = sysErrno();
oflag = 0 + O_WRONLY + O_CREAT + O_TEXT_CREAT + O_TRUNC
+ O_CCSID + O_TEXTDATA + O_SHARE_NONE;
omode = 0 + S_IRUSR + S_IWUSR + S_IRGRP + S_IROTH;
handle = open(path : oflag : omode : fileCcsid : dataCcsid);
// insert error handling if handle is less than zero
rc = writeFile (handle : dataPtr : dataLen);
// insert error handling if rc is not zero
rc = closeFile (handle);
// insert error handling if rc is not zero
/END-FREE
P ifswrite E