长话短说,我需要在cobol程序中处理XML文件,我一直在阅读关于我可以使用企业cobol 6.3中的XML PARSE实用程序执行的内容。
我没有太多处理可变长度文件的经验,但我们最好的猜测是输入文件可能是可变长度的。我有一个示例文件,我想测试,它有以下信息屏幕
Data Set Name . . . . : TDES.XML.SPOT.TR
General Data Current Allocation
Management class . . : **None** Allocated blocks . : 5
Storage class . . . : **None** Allocated extents . : 1
Volume serial . . . : ABCXYZ
Device type . . . . : 3390
Data class . . . . . : **None**
Organization . . . : PS Current Utilization
Record format . . . : VB Used blocks . . . . : 1
Record length . . . : 10000 Used extents . . . : 1
Block size . . . . : 10004
1st extent blocks . : 5
Secondary blocks . : 0 Dates
Data set name type : Creation date . . . : 2021/10/27
Referenced date . . : 2021/10/27
Expiration date . . : ***None***
SMS Compressible . : NO
这是我为这个任务实现的cobol代码的摘录
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. XXXXXXXX.
AUTHOR. XXXXXXXX.
******************************************************************
* E N V I R O N M E N T D I V I S I O N *
******************************************************************
ENVIRONMENT DIVISION.
*
CONFIGURATION SECTION.
*
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
******************************************************************
* I N P U T - O U T P U T S E C T I O N *
******************************************************************
INPUT-OUTPUT SECTION.
*
FILE-CONTROL.
****************************************************************
DESODH SELECT FENTRADA
DESODH ASSIGN TO FENTRADA
DESODH ORGANIZATION IS SEQUENTIAL
DESODH ACCESS MODE IS SEQUENTIAL
DESODH FILE STATUS IS FS-FENTRADA-XML.
******************************************************************
* D A T A D I V I S I O N *
******************************************************************
DATA DIVISION.
******************************************************************
* FILE SECTION *
******************************************************************
*
FILE SECTION.
*
DESODH FD FENTRADA
DESODH LABEL RECORDS STANDARD
DESODH RECORD IS VARYING FROM 1 TO 10000 DEPENDING ON W-REC-LENGTH
DESODH RECORDING MODE IS V
DESODH BLOCK CONTAINS 0 RECORDS.
DESODH 01 REG-FENTRADA.
02 PIC X OCCURS 1 TO 10000 DEPENDING ON W-REC-LENGTH.
WORKING-STORAGE SECTION.
*
******************************************************************
* DEFINICIÓN DEL FICHERO DE ENTRADA *
******************************************************************
01 REG-ENTRADA PIC X(1300).
*
******************************************************************
* DEFINICIÓN DE LOS FICHEROS DE SALIDA *
******************************************************************
COPY FMIF1113.
*
******************************************************************
* DEFINICIÓN DE VARIABLES WORKING *
******************************************************************
01 W-VARIABLES-AUXILIARES.
** VARIABLES A CAMBIAR EN CADA PROGRAMA:
05 W-CONT-CAMPOS PIC 9(03) VALUE 46.
** VARIABLES A CAMBIAR EN CADA PROGRAMA:
05 W-SITUACION PIC 9(04) VALUE ZEROS.
05 W-MENSAJE PIC X(100) VALUE SPACES.
05 W-STATUS PIC X(02) VALUE SPACES.
...................
******************************************************************
* P R O C E D U R E D I V I S I O N *
******************************************************************
PROCEDURE DIVISION.
PERFORM 1000-INICIO
PERFORM 4000-PROCESO-XML UNTIL SI-FIN-PROCESO-XML
PERFORM 3000-FINAL
STOP RUN.
******************************************************************
* 1000-INICIO. *
******************************************************************
1000-INICIO.
MOVE 1000 TO W-SITUACION.
DESODH PERFORM 1060-ABRIR-FICHERO-XML
.
DESODH******************************************************************
DESODH* 1060-ABRIR-FICHERO-XML *
DESODH******************************************************************
DESODH 1060-ABRIR-FICHERO-XML.
DESODH
DESODH MOVE 1060 TO W-SITUACION.
DESODH SET NO-ERROR-LECTURA TO TRUE
DESODH SET NO-FIN-FENTRADA TO TRUE
DESODH SET NO-TAG-ENCONTRADO TO TRUE
DESODH SET NO-ENCONTRADO-IDENTIFICADOR TO TRUE
DESODH SET NO-VERSION-INFORMATION TO TRUE
DESODH SET NO-ENCODING-DECLARATION TO TRUE
DESODH OPEN INPUT FENTRADA
DESODH
DESODH IF FS-FENTRADA-XML NOT = 00
DESODH DISPLAY 'ERROR AL ABRIR FICHERO XML. FS: ' FS-FENTRADA-XML
DESODH MOVE 'ERROR OPEN FENTRADA ' TO W-MENSAJE
DESODH MOVE FS-FENTRADA-XML TO W-STATUS
DESODH PERFORM PR-FIN-ERROR-LOGICO
DESODH END-IF.
DESODH
DESODH PERFORM 8000-LEER-FENTRADA
DESODH******************************************************************
DESODH* 8000-LEER-FENTRADA
DESODH******************************************************************
DESODH 8000-LEER-FENTRADA.
DESODH MOVE 8000 TO W-SITUACION
DESODH READ FENTRADA
DESODH AT END SET SI-FIN-PROCESO-XML TO TRUE
DESODH IF FS-FENTRADA-XML NOT = 0
DESODH DISPLAY 'ERROR EN EL READ XML. FS: ' FS-FENTRADA-XML
DESODH MOVE 'ERROR READ FENTRADA ' TO W-MENSAJE
DESODH MOVE FS-FENTRADA-XML TO W-STATUS
DESODH PERFORM PR-FIN-ERROR-LOGICO
DESODH END-IF
DESODH .
...........................more code
这是我打开文件时得到的错误。文件状态39。长度不匹配,我不确定它在哪里。
********************************* TOP OF DATA **********************************OF DATA **********************************
IGZ0201W A file attribute mismatch was detected. File FENTRADA in program MIFD1113 had a record length of 10004 and
the file specified in the ASSIGN clause had a record length of 10000.
ERROR AL ABRIR FICHERO XML. FS: 39
************************************************
* PROGRAMA MIFD1113 ERROR EJECUCION *
************************************************
* PARRAFO : 1060
* STATUS : 39
* NOMBRE RUT :
* MENSAJE : ERROR OPEN FENTRADA
* CLAVE-ACCESO :
************************************************
CEE3250C The system or user abend U1777 R=NULL was issued.
From compile unit BKCANCEL at entry point BKCANCEL at compile unit offset +000006D6 at entry offset +000006D6
at address 000C30D6.
<> LEAID ENTERED (LEVEL 02/26/2016 AT 17.55)
<> LEAID PROCESSING COMPLETE. RC=4
******************************** BOTTOM OF DATA ********************************M OF DATA ********************************
问题是你想处理一个LINE SEQUENTIAL
文件,但指定了ORGANIZATION SEQUENTIAL
不同的长度,所以你得到一个你实际上不想要的VB文件(长度为4字节填充)。
换成LINE SEQUENTIAL
,你可能就没事了。
更多细节可以在IBM程序员指南"处理行顺序文件"中看到。