【问题标题】:Cobol XML - Remove empty tags [closed]Cobol XML - 删除空标签 [关闭]
【发布时间】:2022-03-16 08:33:08
【问题描述】:

我想在 cobol 中生成没有空标签的 XML 语句。如果子值为空,我当前的输出不会删除父标记。 下面是我的结构。

    01 GrpHdr.
      02 A1.
      03 MsgId                         PIC X(50) VALUE SPACES.
      03 Test3.
        05 Test31.
          07 Test32                    PIC X(10) VALUE SPACES.
        05 Test4.
          07 Test5.
            09 Test6.
              11 Test7                 PIC X(10) VALUE SPACES.
    MAIN-PARA.
    
            MOVE 'MESSAGE ID'          TO MsgId.
            MOVE SPACES                TO Test32.
            MOVE 'TEST7'               TO Test7.
    
            INITIALIZE OUTPUT-XML.
    
                XML GENERATE OUTPUT-XML from Grphdr
SUPPRESS Test31 EVERY NONUMERIC ELEMENT WHEN SPACES
                  ON EXCEPTION
                     DISPLAY 'GENERATE XML Error-Header'
                  NOT ON EXCEPTION
                     CONTINUE
            END-XML
            XML PARSE OUTPUT-XML PROCESSING PROCEDURE 1-XML-PARSE-FORM.

    MAIN-EXIT.
        EXIT.

         1-XML-PARSE-FORM SECTION.
         *----------------------*
    
          EVALUATE XML-EVENT
            WHEN 'START-OF-ELEMENT'
            IF ELEMENT NOT = SPACE
              IF DEPTH > 1
                MOVE SPACES TO XML-REC
                STRING INDENT(1:2 * DEPTH - 2) DELIMITED BY SIZE
                       BUFFER(1:POSD - 1)      DELIMITED BY SIZE
                        INTO XML-REC
                MOVE SPACES  TO BUFFER
              WRITE XML-REC  
    
            ELSE
              MOVE BUFFER(1:POSD - 1) TO XML-REC
              MOVE SPACES   TO BUFFER
              IF XML-REC NOT = SPACES AND LOW-VALUES
                 WRITE XML-REC 
              END-IF
            END-IF
          END-IF
         MOVE XML-TEXT TO ELEMENT
         ADD 1 TO DEPTH
         MOVE 1 TO POSE
         STRING '<' XML-TEXT '>' DELIMITED BY SIZE INTO BUFFER
             WITH POINTER POSE
         MOVE POSE TO POSD
       WHEN 'CONTENT-CHARACTERS'
         MOVE 'N' TO WS-VALUE-SPACES
         STRING XML-TEXT DELIMITED BY SIZE INTO BUFFER
             WITH POINTER POSD
         IF XML-TEXT = SPACES
            MOVE 'Y'   TO WS-VALUE-SPACES
            MOVE SPACES  TO XML-REC
         END-IF
       WHEN 'END-OF-ELEMENT'
         IF WS-VALUE-SPACES NOT = 'Y'
         STRING '</' XML-TEXT '>' DELIMITED BY SIZE INTO BUFFER
             WITH POINTER POSD
           IF DEPTH > 1
             MOVE SPACES TO XML-REC
             STRING INDENT(1:2 * DEPTH - 2) DELIMITED BY SIZE
                       BUFFER(1:POSD - 1)   DELIMITED BY SIZE
                                      INTO XML-REC
             WRITE XML-REC
           ELSE
                MOVE BUFFER(1:POSD - 1) TO XML-REC
                WRITE XML-REC
             END-IF
           END-IF
           SUBTRACT 1 FROM DEPTH
           MOVE 1 TO POSD
           MOVE SPACE TO ELEMENT
           MOVE SPACE TO BUFFER
         WHEN OTHER
           CONTINUE
     END-EVALUATE.

 1-EXIT.
     EXIT.
     

如果标签 TEST32 为空且标签 Test7 非空,我想要如下输出,

<GrpHdr>
<A1>
    <MsgId>MESSAGE ID</MsgId>
    <Test3>
        <Test4>
            <Test5>
                <Test6>
                    <Test7>TEST7</Test7>
                </Test6>
            </Test5>
        </Test4>
    </Test3>
</A1>
</GrpHdr>

你能帮我实现这个目标吗?

如果子值为空,我当前的输出不会删除父标记。

<GrpHdr>
    <A1>
        <MsgId>MESSAGE ID</MsgId>
        <Test3>
            <TEST31></TEST31>
            <Test4>
                <Test5>
                    <Test6>
                        <Test7>TEST7</Test7>
                    </Test6>
                </Test5>
            </Test4>
        </Test3>
    </A1>
    </GrpHdr>

【问题讨论】:

  • 这是可以理解的。请查看tour 以了解有关该站点如何工作的更多信息 - 然后展示您当前使用的代码以及您使用它实现的目标 - 而不仅仅是“我想要那个结果”。
  • 为什么你在乎?它对任何正确编写的 XML 处理器都没有任何影响。
  • 我要求不要根据业务条件填充少量标签。对于少数情况,我必须填充值(非空)来标记 TEST32。
  • 您是否尝试过使用 XML GENERATE 语句的 SUPPRESS 短语?
  • 哦不.. 没有尝试过 SUPPRESS 选项。你能给我一个样品吗..

标签: xml cobol


【解决方案1】:

尝试使用 XML GENERATE statement 的 SUPPRESS 短语。

        XML GENERATE OUTPUT-XML from Grphdr
              SUPPRESS TEST31 WHEN SPACES
              ON EXCEPTION
                 DISPLAY 'GENERATE XML Error-Header'
              NOT ON EXCEPTION
                 CONTINUE
        END-XML

【讨论】:

  • 出现编译错误 --> IGYPA3297-E “抑制标识符“TEST31 (GROUP)”不是基本数据项。“抑制”短语被丢弃。
  • 使用 'EVERY NONUMERIC ELEMENT WHEN SPACES' 后编译的代码。如果我填充非空值以标记“TEST32”并填充 SPACES 以标记“TEST7”,我得到如下输出 <GrpHdr><A1><MsgId>MESSAGE ID</MsgId></A1></GrpHdr> 不显示标签 TEST32 , TEST31, TEST3
猜你喜欢
  • 2014-04-29
  • 2016-10-09
  • 2023-02-16
  • 1970-01-01
  • 2012-01-26
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多