Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有嵌套表和不同子级的COBOL中的XML_Xml_Cobol - Fatal编程技术网

具有嵌套表和不同子级的COBOL中的XML

具有嵌套表和不同子级的COBOL中的XML,xml,cobol,Xml,Cobol,是否可以使用XMLGenerate创建具有不同大小的多级嵌套元素的XML IDENTIFICATION DIVISION. PROGRAM-ID. EXAMPLE1. DATA DIVISION. WORKING-STORAGE SECTION. 77 I

是否可以使用XMLGenerate创建具有不同大小的多级嵌套元素的XML

   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         
       .                    
例如:

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).
使用Enterprise Cobol v4.1编译此文件将产生:

IGYGR1263-S“的发生取决于”对象“子计数”被定义为一个表 元素。“依赖”短语被丢弃

IGYGR116-S表“REPEATING-CHILD”的“DEPENDING”对象无效。这个 “依赖”短语被丢弃

并不是所有的父母都会有相同数量的孩子。如何解决这个问题


编辑:我想从本质上讲,这不是一个真正的XML问题。我在尝试构建工作存储时遇到了麻烦,我希望以后能够将其输入到XML生成中。

我认为问题在于必须定义子计数 在传递给XML GENERATE的记录结构之外。比如:


01儿童计数图9。
01来源-记录。
05重复父母发生5次。
10父名PIC X(7)。
10儿童柜台图9。
重复10次-儿童发生1到5次
取决于儿童人数。
15个孩子的名字PIC X(6)。

然后在生成XML之前,您必须做一些事情 例如:


将子计数移动到子计数器(父计数)

如果要保留重复子项的发生次数

这可能不是你想看到的,因为它几乎 意味着您必须为每个家庭拥有相同数量的受抚养子女
重复发生。我认为你应该完全失去依赖。它不会节省内存,通过确保有效的重复子项的下标在从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>