【发布时间】: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 选项。你能给我一个样品吗..