具有嵌套表和不同子级的COBOL中的XML
是否可以使用XMLGenerate创建具有不同大小的多级嵌套元素的XML具有嵌套表和不同子级的COBOL中的XML,xml,cobol,Xml,Cobol,是否可以使用XMLGenerate创建具有不同大小的多级嵌套元素的XML IDENTIFICATION DIVISION. PROGRAM-ID. EXAMPLE1. DATA DIVISION. WORKING-STORAGE SECTION. 77 I
例如:IDENTIFICATION DIVISION. PROGRAM-ID. EXAMPLE1. DATA DIVISION. WORKING-STORAGE SECTION. 77 I PIC S9(4) BINARY. 77 XL PIC S9(4) BINARY. 77 XML-TAG PIC X(34). 01 XML-DATA. 05 XML-MSG-A PIC X(8000). 05 XML-CHARS-A PIC S9(4) BINARY. 05 XML-MSG-B PIC X(8000). 05 XML-CHARS-B PIC S9(4) BINARY. 01 SOURCE-REC. 05 REPEATING-PARENT OCCURS 5 TIMES. 10 PARENT-NAME PIC X(7). 10 CHILD-COUNT PIC 9. 10 REPEATING-CHILD OCCURS 5 TIMES. 15 CHILD-NAME PIC X(6). 01 XML-STACK. 05 SP PIC S9(4) BINARY. 05 STACK-REC OCCURS 500 TIMES. 15 NODE-NAME PIC X(31). 15 NODE-POS PIC S9(4) BINARY. 15 NODE-IS-EMPTY PIC X. 88 NODE-IS-EMPTY-YES VALUE 'Y'. 88 NODE-IS-EMPTY-NO VALUE 'N'. 15 EMPTY-WHEN-IND PIC X. 88 EMPTY-ZERO-OR-SPACE VALUE 'Z'. 88 EMPTY-NEVER VALUE 'N'. PROCEDURE DIVISION. INITIALIZE SOURCE-REC. MOVE 'p-1' TO PARENT-NAME (1) MOVE 2 TO CHILD-COUNT (1) MOVE 'c-1-1' TO CHILD-NAME (1 1) MOVE 'c-1-2' TO CHILD-NAME (1 2) MOVE 'p-2' TO PARENT-NAME (2) MOVE 0 TO CHILD-COUNT (2) MOVE 'p-3' TO PARENT-NAME (3) MOVE 1 TO CHILD-COUNT (3) MOVE 'c-3-1' TO CHILD-NAME (3 1) XML GENERATE XML-MSG-A FROM SOURCE-REC COUNT IN XML-CHARS-A MOVE ZERO TO XML-CHARS-B MOVE SPACES TO XML-MSG-B XML PARSE XML-MSG-A(1:XML-CHARS-A) PROCESSING PROCEDURE CLEAN-UP PERFORM VARYING I FROM 1 BY 80 UNTIL I > XML-CHARS-B DISPLAY XML-MSG-B (I:80) END-PERFORM GOBACK . CLEAN-UP SECTION. COMPUTE XL = FUNCTION LENGTH (XML-TEXT) EVALUATE XML-EVENT WHEN 'START-OF-ELEMENT' ADD 1 TO SP MOVE XML-TEXT(1:XL) TO NODE-NAME (SP) COMPUTE NODE-POS (SP) = XML-CHARS-B + 1 STRING '<' XML-TEXT(1:XL) '>' DELIMITED BY SIZE INTO XML-TAG MOVE XML-TAG TO XML-MSG-B (XML-CHARS-B + 1:XL + 2) COMPUTE XML-CHARS-B = XML-CHARS-B + XL + 2 SET NODE-IS-EMPTY-YES (SP) TO TRUE ***** EVALUATE XML-TEXT(1:XL) ***** WHEN 'CHILD-COUNT' ***** SET EMPTY-NEVER (SP) TO TRUE ***** WHEN OTHER SET EMPTY-ZERO-OR-SPACE (SP) TO TRUE ***** END-EVALUATE WHEN 'CONTENT-CHARACTERS' IF EMPTY-ZERO-OR-SPACE (SP) AND (XML-TEXT(1:XL) = ZERO OR XML-TEXT(1:XL) = SPACE) CONTINUE ELSE SET NODE-IS-EMPTY-NO (SP) TO TRUE MOVE XML-TEXT(1:XL) TO XML-MSG-B (XML-CHARS-B + 1:XL) COMPUTE XML-CHARS-B = XML-CHARS-B + XL END-IF WHEN 'END-OF-ELEMENT' IF NODE-IS-EMPTY-YES (SP) COMPUTE XML-CHARS-B = NODE-POS (SP) - 1 SUBTRACT 1 FROM SP ELSE STRING '</' XML-TEXT(1:XL) '>' DELIMITED BY SIZE INTO XML-TAG MOVE XML-TAG TO XML-MSG-B (XML-CHARS-B + 1:XL + 3) COMPUTE XML-CHARS-B = XML-CHARS-B + XL + 3 SUBTRACT 1 FROM SP IF SP > ZERO SET NODE-IS-EMPTY-NO (SP) TO TRUE ELSE MOVE SPACES TO XML-MSG-B (XML-CHARS-B + 1:) END-IF END-IF END-EVALUATE .
使用Enterprise Cobol v4.1编译此文件将产生: IGYGR1263-S“的发生取决于”对象“子计数”被定义为一个表 元素。“依赖”短语被丢弃 IGYGR116-S表“REPEATING-CHILD”的“DEPENDING”对象无效。这个 “依赖”短语被丢弃 并不是所有的父母都会有相同数量的孩子。如何解决这个问题01 SOURCE-REC. 05 REPEATING-PARENT OCCURS 5 TIMES. 10 PARENT-NAME PIC X(7). 10 CHILD-COUNT PIC 9. 10 REPEATING-CHILD OCCURS 1 TO 5 TIMES DEPENDING ON CHILD-COUNT. 15 CHILD-NAME PIC X(6).
编辑:我想从本质上讲,这不是一个真正的XML问题。我在尝试构建工作存储时遇到了麻烦,我希望以后能够将其输入到XML生成中。我认为问题在于必须定义子计数 在传递给XML GENERATE的记录结构之外。比如:然后在生成XML之前,您必须做一些事情 例如:01儿童计数图9。 01来源-记录。 05重复父母发生5次。 10父名PIC X(7)。 10儿童柜台图9。 重复10次-儿童发生1到5次 取决于儿童人数。 15个孩子的名字PIC X(6)。
如果要保留重复子项的发生次数 这可能不是你想看到的,因为它几乎 意味着您必须为每个家庭拥有相同数量的受抚养子女将子计数移动到子计数器(父计数)
重复发生。我认为你应该完全失去依赖。它不会节省内存,通过确保有效的重复子项的下标在从1到相应的子计数器的范围内,您可以同样轻松地寻址这些重复子项。第一个答案的摘要:您无法定义 COBOL中包含ODO对象的复杂ODO 在一张桌子里。因此,XML是不可能的 生成以为每个对象生成不同数量的“childern” “父母”的出现。你必须生活在固定的环境中 表维度和空节点 第二轮:您是否考虑过重新解析/重新构建 生成XML字符串以消除空节点?这 听起来可能有点奇怪,但可能并非如此 困难。看一下下面的程序和 它产生的输出
识别部门。 程序ID。示例1。 数据司。 工作和储存科。 77 I PIC S9(4)二进制。 77 XL PIC S9(4)二进制。 77 XML-TAG PICX(34)。 01 XML-DATA。 05 XML-MSG-A PIC X(8000)。 05 XML-CHARS-A PIC S9(4)二进制文件。 05 XML-MSG-B PIC X(8000)。 05 XML-CHARS-B PIC S9(4)二进制文件。 01来源-记录。 05重复父母发生5次。 10父名PIC X(7)。 10儿童计数图9。 重复10次,重复5次。 15个孩子的名字PIC X(6)。 01 XML-STACK。 05 SP PIC S9(4)二进制文件。 05 STACK-REC发生500次。 15节点名称PIC X(31)。 15节点位置PIC S9(4)二进制。 15节点为空,图X。 88节点-为空-是值“Y”。 88 NODE-IS-EMPTY-NO值'N'。 15空时指示图X。 88空零或空空间值“Z”。 88空-从不使用值“N”。 程序司。 初始化SOURCE-REC。 将“p-1”移动到父级名称(1) 移动2到子计数(1) 将“c-1-1”移动到子名称(1) 将“c-1-2”移动到子名称(1-2) 将“p-2”移动到父级名称(2) 将0移动到子计数(2) 将“p-3”移动到父级名称(3) 移动1到子计数(3) 将“c-3-1”移动到子名称(3-1) XML从XML-CHARS-A中的SOURCE-REC计数生成XML-MSG-A 将零移动到XML-CHARS-B 将空格移动到XML-MSG-B XML解析XML-MSG-A(1:XML-CHARS-A) 处理程序清理 执行从1到80的变化I,直到I>XML-CHARS-B 显示XML-MSG-B(I:80) 末端执行 戈巴克 . 清理区。 计算XL=函数长度(XML-TEXT) 评估XML事件 当“元素的开始” 将1添加到SP 将XML-TEXT(1:XL)移动到节点名(SP) 计算节点位置(SP)=XML-CHARS-B+1 由大小分隔的字符串“” 转换为XML-TAG 将XML-TAG移动到XML-MSG-B(XML-CHARS-B+1:XL+2) 计算XML-CHARS-B=XML-CHARS-B+XL+2 将NODE-IS-EMPTY-YES(SP)设置为TRUE *****评估XML-TEXT(1:XL)
MOVE CHILD-COUNT TO CHILD-COUNTER (PARENT-COUNT)
IDENTIFICATION DIVISION. PROGRAM-ID. EXAMPLE1. DATA DIVISION. WORKING-STORAGE SECTION. 77 I PIC S9(4) BINARY. 77 XL PIC S9(4) BINARY. 77 XML-TAG PIC X(34). 01 XML-DATA. 05 XML-MSG-A PIC X(8000). 05 XML-CHARS-A PIC S9(4) BINARY. 05 XML-MSG-B PIC X(8000). 05 XML-CHARS-B PIC S9(4) BINARY. 01 SOURCE-REC. 05 REPEATING-PARENT OCCURS 5 TIMES. 10 PARENT-NAME PIC X(7). 10 CHILD-COUNT PIC 9. 10 REPEATING-CHILD OCCURS 5 TIMES. 15 CHILD-NAME PIC X(6). 01 XML-STACK. 05 SP PIC S9(4) BINARY. 05 STACK-REC OCCURS 500 TIMES. 15 NODE-NAME PIC X(31). 15 NODE-POS PIC S9(4) BINARY. 15 NODE-IS-EMPTY PIC X. 88 NODE-IS-EMPTY-YES VALUE 'Y'. 88 NODE-IS-EMPTY-NO VALUE 'N'. 15 EMPTY-WHEN-IND PIC X. 88 EMPTY-ZERO-OR-SPACE VALUE 'Z'. 88 EMPTY-NEVER VALUE 'N'. PROCEDURE DIVISION. INITIALIZE SOURCE-REC. MOVE 'p-1' TO PARENT-NAME (1) MOVE 2 TO CHILD-COUNT (1) MOVE 'c-1-1' TO CHILD-NAME (1 1) MOVE 'c-1-2' TO CHILD-NAME (1 2) MOVE 'p-2' TO PARENT-NAME (2) MOVE 0 TO CHILD-COUNT (2) MOVE 'p-3' TO PARENT-NAME (3) MOVE 1 TO CHILD-COUNT (3) MOVE 'c-3-1' TO CHILD-NAME (3 1) XML GENERATE XML-MSG-A FROM SOURCE-REC COUNT IN XML-CHARS-A MOVE ZERO TO XML-CHARS-B MOVE SPACES TO XML-MSG-B XML PARSE XML-MSG-A(1:XML-CHARS-A) PROCESSING PROCEDURE CLEAN-UP PERFORM VARYING I FROM 1 BY 80 UNTIL I > XML-CHARS-B DISPLAY XML-MSG-B (I:80) END-PERFORM GOBACK . CLEAN-UP SECTION. COMPUTE XL = FUNCTION LENGTH (XML-TEXT) EVALUATE XML-EVENT WHEN 'START-OF-ELEMENT' ADD 1 TO SP MOVE XML-TEXT(1:XL) TO NODE-NAME (SP) COMPUTE NODE-POS (SP) = XML-CHARS-B + 1 STRING '<' XML-TEXT(1:XL) '>' DELIMITED BY SIZE INTO XML-TAG MOVE XML-TAG TO XML-MSG-B (XML-CHARS-B + 1:XL + 2) COMPUTE XML-CHARS-B = XML-CHARS-B + XL + 2 SET NODE-IS-EMPTY-YES (SP) TO TRUE ***** EVALUATE XML-TEXT(1:XL) ***** WHEN 'CHILD-COUNT' ***** SET EMPTY-NEVER (SP) TO TRUE ***** WHEN OTHER SET EMPTY-ZERO-OR-SPACE (SP) TO TRUE ***** END-EVALUATE WHEN 'CONTENT-CHARACTERS' IF EMPTY-ZERO-OR-SPACE (SP) AND (XML-TEXT(1:XL) = ZERO OR XML-TEXT(1:XL) = SPACE) CONTINUE ELSE SET NODE-IS-EMPTY-NO (SP) TO TRUE MOVE XML-TEXT(1:XL) TO XML-MSG-B (XML-CHARS-B + 1:XL) COMPUTE XML-CHARS-B = XML-CHARS-B + XL END-IF WHEN 'END-OF-ELEMENT' IF NODE-IS-EMPTY-YES (SP) COMPUTE XML-CHARS-B = NODE-POS (SP) - 1 SUBTRACT 1 FROM SP ELSE STRING '</' XML-TEXT(1:XL) '>' DELIMITED BY SIZE INTO XML-TAG MOVE XML-TAG TO XML-MSG-B (XML-CHARS-B + 1:XL + 3) COMPUTE XML-CHARS-B = XML-CHARS-B + XL + 3 SUBTRACT 1 FROM SP IF SP > ZERO SET NODE-IS-EMPTY-NO (SP) TO TRUE ELSE MOVE SPACES TO XML-MSG-B (XML-CHARS-B + 1:) END-IF END-IF END-EVALUATE .
<SOURCE-REC><REPEATING-PARENT><PARENT-NAME>p-1</PARENT-NAME><CHILD-COUNT>2</CHIL D-COUNT><REPEATING-CHILD><CHILD-NAME>c-1-1</CHILD-NAME></REPEATING-CHILD><REPEAT ING-CHILD><CHILD-NAME>c-1-2</CHILD-NAME></REPEATING-CHILD></REPEATING-PARENT><RE PEATING-PARENT><PARENT-NAME>p-2</PARENT-NAME></REPEATING-PARENT><REPEATING-PAREN T><PARENT-NAME>p-3</PARENT-NAME><CHILD-COUNT>1</CHILD-COUNT><REPEATING-CHILD><CH ILD-NAME>c-3-1</CHILD-NAME></REPEATING-CHILD></REPEATING-PARENT></SOURCE-REC>