Reputation: 301
Reading xml from a file or even xml declared in "working storage" as a string array
XML PARSE XML-STRING PROCEDURE XML-HANDLER
throws exception +000528897
I checked if the xml is well formed (displayed in browser) and it's ok
I displayed the xml string after reading it from a file and concatenating all the lines as a long string
We are using Cobol 5.2
compiler option -> xmlparse(xmlss)
If I change the option to xmlparse(compat) the exception is 72
IDENTIFICATION DIVISION.
PROGRAM-ID. TDXMLTST.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
*************************
FILE-CONTROL.
SELECT XMLDATA ASSIGN TO XMLFILE.
DATA DIVISION.
FILE SECTION.
*=================================================================
FD XMLDATA
RECORDING MODE IS F
LABEL RECORD STANDARD
DATA RECORD IS XMLREC.
01 XMLREC PIC X(80).
WORKING-STORAGE SECTION.
******************************************************************
* XML DOCUMENT, ENCODED AS INITIAL VALUES OF DATA ITEMS. *
******************************************************************
01 NOT-EOF PIC X(01) VALUE 'N'.
01 I-FROM PIC S9(4) COMP VALUE 0.
01 XML-STRING PIC X(1000) VALUE SPACES.
01 EZ-PTR PIC S9(4) COMP VALUE 1.
******************************************************************
******************************************************************
* SAMPLE DATA DEFINITIONS FOR PROCESSING NUMERIC XML CONTENT. *
******************************************************************
1 CURRENT-ELEMENT PIC X(30).
1 LIST-PRICE COMPUTATIONAL PIC 9V99 VALUE 0.
1 DISCOUNT COMPUTATIONAL PIC 9V99 VALUE 0.
1 DISPLAY-PRICE PIC $$9.99.
PROCEDURE DIVISION.
MAINLINE SECTION.
PERFORM READ-XML-FILE
DISPLAY 'XML-DOCUMENT=' XML-STRING(1:EZ-PTR)
XML PARSE XML-STRING(1:EZ-PTR)
PROCESSING PROCEDURE XML-HANDLER
ON EXCEPTION
DISPLAY 'XML DOCUMENT ERROR ' XML-CODE
NOT ON EXCEPTION
DISPLAY 'XML DOCUMENT SUCCESSFULLY PARSED'
END-XML
******************************************************************
* PROCESS THE TRANSFORMED CONTENT AND CALCULATE PROMO PRICE. *
******************************************************************
DISPLAY ' '
DISPLAY '-----+++++***** USING INFORMATION FROM XML '
'*****+++++-----'
DISPLAY ' '
MOVE LIST-PRICE TO DISPLAY-PRICE
DISPLAY ' SANDWICH LIST PRICE: ' DISPLAY-PRICE
COMPUTE DISPLAY-PRICE = LIST-PRICE * (1 - DISCOUNT)
DISPLAY ' PROMOTIONAL PRICE: ' DISPLAY-PRICE
DISPLAY ' GET ONE TODAY!'
GOBACK.
MAINLINE-EXIT. EXIT.
READ-XML-FILE SECTION.
OPEN INPUT XMLDATA
PERFORM UNTIL NOT-EOF = 'Y'
READ XMLDATA
AT END MOVE 'Y' TO NOT-EOF
END-READ
IF NOT-EOF = 'N' THEN
PERFORM VARYING I-FROM
FROM 72
BY -1
UNTIL XMLREC(I-FROM:1) NOT = ' '
END-PERFORM
STRING XMLREC(1:I-FROM) DELIMITED BY SIZE
INTO XML-STRING
WITH POINTER EZ-PTR
END-STRING
DISPLAY 'EZ-PTR=' EZ-PTR
END-IF
END-PERFORM
CLOSE XMLDATA
.
READ-XML-FILE-EXIT. EXIT.
XML-HANDLER SECTION.
DISPLAY 'XML-EVENT=' XML-EVENT
EVALUATE XML-EVENT
* ==> ORDER XML EVENTS MOST FREQUENT FIRST
WHEN 'START-OF-ELEMENT'
DISPLAY 'START ELEMENT TAG: <' XML-TEXT '>'
MOVE XML-TEXT TO CURRENT-ELEMENT
WHEN 'CONTENT-CHARACTERS'
DISPLAY 'CONTENT CHARACTERS: <' XML-TEXT '>'
* ==> TRANSFORM XML CONTENT TO OPERATIONAL COBOL DATA ITEM...
EVALUATE CURRENT-ELEMENT
WHEN 'LISTPRICE'
* ==> USING FUNCTION NUMVAL-C...
COMPUTE LIST-PRICE = FUNCTION NUMVAL-C(XML-TEXT)
WHEN 'DISCOUNT'
COMPUTE DISCOUNT = FUNCTION NUMVAL-C(XML-TEXT)
END-EVALUATE
WHEN 'END-OF-ELEMENT'
DISPLAY 'END ELEMENT TAG: <' XML-TEXT '>'
MOVE SPACES TO CURRENT-ELEMENT
WHEN 'START-OF-DOCUMENT'
COMPUTE XML-DOCUMENT-LENGTH = FUNCTION LENGTH(XML-TEXT)
DISPLAY 'START OF DOCUMENT: LENGTH=' XML-DOCUMENT-LENGTH
' CHARACTERS.'
WHEN 'END-OF-DOCUMENT'
DISPLAY 'END OF DOCUMENT.'
WHEN 'VERSION-INFORMATION'
DISPLAY 'VERSION: <' XML-TEXT '>'
WHEN 'ENCODING-DECLARATION'
DISPLAY 'ENCODING: <' XML-TEXT '>'
WHEN 'STANDALONE-DECLARATION'
DISPLAY 'STANDALONE: <' XML-TEXT '>'
WHEN 'ATTRIBUTE-NAME'
DISPLAY 'ATTRIBUTE NAME: <' XML-TEXT '>'
WHEN 'ATTRIBUTE-CHARACTERS'
DISPLAY 'ATTRIBUTE VALUE CHARACTERS: <' XML-TEXT '>'
WHEN 'ATTRIBUTE-CHARACTER'
DISPLAY 'ATTRIBUTE VALUE CHARACTER: <' XML-TEXT '>'
WHEN 'START-OF-CDATA-SECTION'
DISPLAY 'START OF CDATA: <' XML-TEXT '>'
WHEN 'END-OF-CDATA-SECTION'
DISPLAY 'END OF CDATA: <' XML-TEXT '>'
WHEN 'CONTENT-CHARACTER'
DISPLAY 'CONTENT CHARACTER: <' XML-TEXT '>'
WHEN 'PROCESSING-INSTRUCTION-TARGET'
DISPLAY 'PI TARGET: <' XML-TEXT '>'
WHEN 'PROCESSING-INSTRUCTION-DATA'
DISPLAY 'PI DATA: <' XML-TEXT '>'
WHEN 'COMMENT'
DISPLAY 'COMMENT: <' XML-TEXT '>'
WHEN 'EXCEPTION'
* COMPUTE XML-DOCUMENT-LENGTH = FUNCTION LENGTH (XML-TEXT)
DISPLAY 'EXCEPTION ' XML-CODE ' AT OFFSET '
EZ-PTR '.'
MOVE -1 TO XML-CODE
MOVE 16 TO RETURN-CODE
WHEN OTHER
DISPLAY 'UNEXPECTED XML EVENT: ' XML-EVENT '.'
END-EVALUATE
.
XML-HANDLER-EXIT. EXIT.
XML DOCUMENT ERROR +000528897
Upvotes: 2
Views: 1423
Reputation: 10775
You have a CCSID problem, which can be solved by either...
CODEPAGE(1140)
to your compile options via whichever method is accepted in your shopENCODING 1140
phrase to your XML PARSE statementWhen using the XMLPARSE(COMPAT) compile option (the "native COBOL" parser), the XML-CODE value of 72 is documented as...
The actual document encoding was EBCDIC, the CODEPAGE compiler option did not specify a supported EBCDIC code page, and the document did not contain an encoding declaration.
When using the XMLPARSE(XMLSS) compile option (the z/OS XML System Services parser), the XML-CODE value is the concatenation of XML Return Code and XML Reason Code, each is a halfword. Decimal +000528897 is x'81201' so the XML Reason Code is 1201 and the XML Return Code is 8. Return code 8 is documented as "XRC_FAILURE" with the note...
Processing failed. Returned data areas and parms valid.
...and reason code 1201 is documented as...
XRSN_PARM_ENCODING_SPEC_INVALID The ccsid passed is not supported. Action: The CCSID parameter on the call to GXL1INI or GXL4INI is not one of the supported character encodings. Pass only permitted CCSID parameters. See the documentation of the GXL1INI service for supported ccsid constants.
Upvotes: 5