user3274100
user3274100

Reputation: 301

Cobol xml parse got exception

Cobol xml parse throws exception +000528897

Reading xml from a file or even xml declared in "working storage" as a string array

The Cobol parse command:

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

enter image description here

I displayed the xml string after reading it from a file and concatenating all the lines as a long string

enter image description here

We are using Cobol 5.2

compiler option -> xmlparse(xmlss)

If I change the option to xmlparse(compat) the exception is 72

This is the Cobol source

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

Answers (1)

cschneid
cschneid

Reputation: 10775

You have a CCSID problem, which can be solved by either...

  • adding CODEPAGE(1140) to your compile options via whichever method is accepted in your shop
  • adding the ENCODING 1140 phrase to your XML PARSE statement

When 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

Related Questions