'Cobol XML - Remove empty tags [closed]
I want to generate XML statement without empty tags in cobol. My current output doesnt remove the parent tag if child value is empty. below is my structure.
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.
If tag TEST32 is empty and tag Test7 is non empty, i want the output like below,
<GrpHdr>
<A1>
<MsgId>MESSAGE ID</MsgId>
<Test3>
<Test4>
<Test5>
<Test6>
<Test7>TEST7</Test7>
</Test6>
</Test5>
</Test4>
</Test3>
</A1>
</GrpHdr>
Could you please help me to achieve this.
My current output doesnt remove the parent tag if child value is empty.
<GrpHdr>
<A1>
<MsgId>MESSAGE ID</MsgId>
<Test3>
<TEST31></TEST31>
<Test4>
<Test5>
<Test6>
<Test7>TEST7</Test7>
</Test6>
</Test5>
</Test4>
</Test3>
</A1>
</GrpHdr>
Solution 1:[1]
Try using the SUPPRESS phrase of the XML GENERATE statement.
XML GENERATE OUTPUT-XML from Grphdr
SUPPRESS TEST31 WHEN SPACES
ON EXCEPTION
DISPLAY 'GENERATE XML Error-Header'
NOT ON EXCEPTION
CONTINUE
END-XML
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | cschneid |
