xml - Cobol xml 解析出现异常

标签 xml exception cobol zos

Cobol xml 解析抛出异常 +000528897

从文件中读取 xml,甚至从“工作存储”中声明为字符串数组的 xml

Cobol 解析命令:

XML 解析 XML-STRING 过程 XML-HANDLER

抛出异常+000528897

我检查了 xml 格式是否正确(在浏览器中显示)并且没问题

enter image description here

我从文件中读取 xml 字符串并将所有行连接为长字符串后显示了该字符串

enter image description here

我们正在使用 Cobol 5.2

编译选项 -> xmlparse(xmlss)

如果我将选项更改为 xmlparse(compat),则异常为 72

这是 Cobol 源代码

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 文档错误 +000528897

最佳答案

您遇到了 CCSID 问题,可以通过以下任一方式解决...

  • 通过您商店接受的任何方法将 CODEPAGE(1140) 添加到您的编译选项
  • ENCODING 1140 短语添加到 XML PARSE 语句

当使用 XMLPARSE(COMPAT) 编译选项(“ native COBOL”解析器)时,XML-CODE 值 72 为 documented作为...

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.

使用 XMLPARSE(XMLSS) 编译选项(z/OS XML System Services 解析器)时,XML-CODE 值为 concatenation XML 返回代码和 XML 原因代码,每个都是一个半字。十进制 +000528897 为 x'81201',因此 XML 原因代码为 1201,XML 返回代码为 8。返回代码 8 为 documented作为“XRC_FAILURE”并附注...

Processing failed. Returned data areas and parms valid.

...原因代码 1201 是 documented作为...

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.

关于xml - Cobol xml 解析出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57290906/

相关文章:

php - simplexml 帮助我如何解析这个?

file - 在 COBOL 中创建文件

sql - 如何通过 SQL 查询从 XML 中的键值对检索值?

XML 和 XSD - 使用元素名称替换 xsi :type for polymorphism

C# 等同于 Java 的 Exception.printStackTrace()?

java - 在 try catch 中处理两个不同的连接关闭

java - 我如何从 Hibernate Exception 中提取 constraintName

cobol - 在 Cobol 中,为了测试 "null or empty"我们使用 "NOT = SPACE [ AND/OR ] LOW-VALUE"?它是哪一个?

cobol - 在源代码中嵌入编译器选项

xml - 如何在XQuery中将元素节点转换为文档