Re: Read a XML document in COBOL
- From: "Richard" <riplin@xxxxxxxxxxxx>
- Date: 24 Nov 2006 12:58:27 -0800
Richard wrote:
Test program
IDENTIFICATION DIVISION.
PROGRAM-ID. xmltest.
* xmltest.lst
* xmlparse.cbl
* \az\xmltest.dta
*
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT XML-File
ASSIGN XML-Name
ORGANIZATION LINE SEQUENTIAL
FILE STATUS File-Status
.
DATA DIVISION.
FILE SECTION.
FD XML-File.
01 XML-Record.
03 XMLC PIC X OCCURS 256.
WORKING-STORAGE SECTION.
01 XML-Name PIC X(80).
01 File-Status.
03 FS-B1 PIC X.
03 FS-B2 PIC X.
01 DA-Index PIC S9(4).
01 DA-Limit PIC S9(4).
01 DA-Found PIC S9(4).
01 XML-Data-Array.
03 DA-Item OCCURS 100.
05 DA-Level PIC 99.
05 DA-Name PIC X(20).
05 DA-Attribute PIC X(20).
05 DA-Repeats PIC X.
05 DA-Value PIC X(100).
01 Work-Text.
03 Work-Level.
05 Work-LevelZ PIC ZZZ9.
03 Work-Name PIC X(20).
03 Work-Repeat PIC X(8).
01 FILLER.
05 FILLER PIC X(32) VALUE
'WORKING-STORAGE FOR XMLTEST >>>:'.
05 WK-EOF-SW PIC X.
05 WK-TAG PIC X(21).
05 TAG-TABLE.
10 FILLER PIC X(21) VALUE 'Start tag:'.
10 FILLER PIC X(21) VALUE 'End tag:'.
10 FILLER PIC X(21) VALUE 'Attribute-Value pair:'.
10 FILLER PIC X(21) VALUE 'Character data:'.
10 FILLER PIC X(21) VALUE 'End-of-document'.
10 FILLER PIC X(21) VALUE 'Parsing error.'.
10 FILLER PIC X(21) VALUE 'Unknown return code 7'.
10 FILLER PIC X(21) VALUE 'Unknown return code 8'.
10 FILLER PIC X(21) VALUE 'Unknown return code 9'.
05 FILLER REDEFINES TAG-TABLE.
10 TAG-X PIC X(21) OCCURS 9 TIMES.
01 File-Parameter PIC X(80).
01 WS-XML-Name PIC X(80).
01 WS-Control-Name PIC X(80).
01 Tag-Level PIC 9(4).
01 White PIC S9(4) COMP.
01 I PIC S9(4) COMP.
COPY "xmlparse.ws". *> \az\include\xmlparse.ws
01 XML-Element-Name-xxx PIC X(20).
01 XML-Attribute-Name-xxx PIC X(15).
01 XML-Data-Value-xxx PIC X(60).
PROCEDURE DIVISION.
Program-XMLTest.
MOVE SPACES TO XML-Data-Array
MOVE ZERO TO DA-Index
DA-Limit
MOVE SPACES TO WS-XML-Name
WS-Control-Name
* ACCEPT File-Parameter FROM COMMAND-LINE
DISPLAY "FileName ControlName: "
ACCEPT File-Parameter
UNSTRING File-Parameter
DELIMITED BY ALL SPACES
INTO WS-XML-Name
WS-Control-Name
IF ( WS-Control-Name NOT = SPACES )
PERFORM Read-Control
END-IF
MOVE WS-XML-Name TO XML-Name
MOVE 20000 TO XML-Occurs
MOVE ALL ZEROES TO XML-Reserved
MOVE SPACES TO XML-Parsed-Area
XML-Document
MOVE ZERO TO XML-Return-Code
MOVE 1 TO XML-Length
MOVE '0' TO WK-EoF-Sw
OPEN INPUT XML-File
IF ( FS-B1 NOT = ZERO )
DISPLAY "File Failed: " File-Status
MOVE '1' TO WK-EOF-SW
END-IF
PERFORM
UNTIL WK-EoF-Sw = "1"
READ XML-File
AT END
MOVE '1' TO WK-EOF-SW
NOT AT END
* DISPLAY XML-Record
IF ( XML-Record = SPACES )
CONTINUE
ELSE
MOVE 1 TO White
PERFORM
VARYING I FROM 1 BY 1
UNTIL I > 256
OR XML-Length >= XML-Occurs
IF ( XMLC(I) = SPACE
AND White = 1
)
CONTINUE
ELSE
MOVE XMLC(I)
TO
XML-Document-X(XML-Length)
ADD 1 TO XML-Length
END-IF
IF ( XMLC(I) = SPACE )
MOVE 1 TO White
ELSE
MOVE ZERO TO White
END-IF
END-PERFORM
END-IF
END-READ
END-PERFORM
CLOSE XML-File
* DISPLAY XML-Document
* DISPLAY "Length = " XML-Length
MOVE ZERO TO Tag-Level
PERFORM Get-XML-Item
UNTIL XML-Return-Code > 4
MOVE ZERO TO Return-Code
STOP RUN
.
Get-XML-Item.
FJON * CALL 'XMLPARSE'
FJOFF CALL 'xmlparse'
USING XML-Interface
XML-Document
MOVE XML-Element-Name TO XML-Element-Name-xxx
MOVE XML-Attribute-Name TO XML-Attribute-Name-xxx
MOVE XML-Data-Value TO XML-Data-Value-xxx
MOVE TAG-X(XML-Return-Code) TO WK-Tag
MOVE ZERO TO DA-Found
EVALUATE XML-Return-Code
WHEN 1 ADD 1 TO Tag-Level
WHEN 2 SUBTRACT 1 FROM Tag-Level
WHEN 3 PERFORM Find-Data-Table
WHEN 4 MOVE "CDATA" TO XML-Attribute-Name-xxx
PERFORM Find-Data-Table
END-EVALUATE
IF ( DA-Found > ZERO )
PERFORM Display-Data-Found
END-IF
.
Display-Data-Found.
* DISPLAY WK-Tag
DISPLAY Tag-Level
'/' XML-Element-Name-xxx
'/' XML-Attribute-Name-xxx
'/' XML-Data-Value-xxx
.
Read-Control.
MOVE WS-Control-Name TO XML-Name
MOVE '0' TO WK-EoF-Sw
OPEN INPUT XML-File
IF ( FS-B1 NOT = ZERO )
DISPLAY "File Failed: " File-Status
MOVE '1' TO WK-EOF-SW
END-IF
PERFORM
UNTIL WK-EoF-Sw = "1"
READ XML-File
AT END
MOVE '1' TO WK-EOF-SW
NOT AT END
* DISPLAY XML-Record
MOVE SPACES TO Work-Text
IF ( XML-Record = SPACES )
CONTINUE
ELSE
IF ( XML-Record(1:1) = "+" )
PERFORM Add-Attribute
ELSE
UNSTRING XML-Record
DELIMITED BY ","
INTO Work-Level
Work-Name
Work-Repeat
ADD 1 TO DA-Limit
MOVE Work-LevelZ TO DA-Level (DA-Limit)
MOVE Work-Name TO DA-Name (DA-Limit)
MOVE SPACES TO DA-Attribute(DA-Limit)
MOVE Work-Repeat TO DA-Repeats (DA-Limit)
MOVE SPACES TO DA-Value (DA-Limit)
END-IF
END-IF
END-READ
END-PERFORM
CLOSE XML-File
MOVE '0' TO WK-EoF-Sw
* PERFORM Display-Data-Table
.
Add-Attribute.
IF ( DA-Limit < 1 )
CONTINUE
ELSE
IF ( DA-Attribute(DA-Limit) NOT = SPACES )
MOVE DA-Limit TO DA-Index
ADD 1 TO DA-Limit
MOVE DA-Level (DA-Index) TO DA-Level (DA-Limit)
MOVE DA-Name (DA-Index) TO DA-Name (DA-Limit)
MOVE DA-Repeats(DA-Index) TO DA-Repeats(DA-Limit)
MOVE SPACES TO DA-Value (DA-Limit)
END-IF
MOVE XML-Record(2:) TO DA-Attribute(DA-Limit)
END-IF
.
Display-Data-Table.
PERFORM
VARYING DA-Index FROM 1 BY 1
UNTIL DA-Index > DA-Limit
DISPLAY DA-Level (DA-Index)
DA-Name (DA-Index)
DA-Attribute(DA-Index)
DA-Repeats (DA-Index)
END-PERFORM
.
Find-Data-Table.
MOVE ZERO TO DA-Found
PERFORM
VARYING DA-Index FROM 1 BY 1
UNTIL DA-Index > DA-Limit
OR DA-Found NOT = ZERO
IF ( XML-Element-Name-xxx = DA-Name (DA-Index)
AND XML-Attribute-Name-xxx = DA-Attribute(DA-Index)
)
MOVE DA-Index TO DA-Found
END-IF
END-PERFORM
.
* ================================================================
.
- References:
- Read a XML document in COBOL
- From: olivierdeman
- Re: Read a XML document in COBOL
- From: Richard
- Read a XML document in COBOL
- Prev by Date: Re: Read a XML document in COBOL
- Next by Date: cobolc
- Previous by thread: Re: Read a XML document in COBOL
- Next by thread: Re: Read a XML document in COBOL
- Index(es):
Relevant Pages
|