COBOL XML解析等价于innerXML?

COBOL XML解析等价于innerXML?,xml,cobol,Xml,Cobol,我试图访问下面示例XML中的整个“”节点,包括开始和结束标记。我需要将XML片段作为XML存储在数据库中 <a> <mynode > <c>Content</c> <c>More content</c> </mynode > </a> XML解析在任何语言中都有点棘手。我建议为您的特定COBOL环境找到一个解析器库。简要概述XML解析领域。考虑是否需要传递XML文件一次,边传递边

我试图访问下面示例XML中的整个“”节点,包括开始和结束标记。我需要将XML片段作为XML存储在数据库中

<a>
  <mynode >
   <c>Content</c>
   <c>More content</c>
  </mynode >
</a>

XML解析在任何语言中都有点棘手。我建议为您的特定COBOL环境找到一个解析器库。简要概述XML解析领域。考虑是否需要传递XML文件一次,边传递边提取所需信息(SAX方法对您有效),或者是否希望将XML加载到内存并遍历其结构(希望访问DOM[文档对象模型])

事实上,您的COBOL方言可能有
XMLParse
语句(我的旧COBOL85编译器没有)


这里有一点。在任何语言中,XML解析都有点棘手。我建议为您的特定COBOL环境找到一个解析器库。简要概述XML解析领域。考虑是否需要传递XML文件一次,边传递边提取所需信息(SAX方法对您有效),或者是否希望将XML加载到内存并遍历其结构(希望访问DOM[文档对象模型])

事实上,您的COBOL方言可能有
XMLParse
语句(我的旧COBOL85编译器没有)

这里有一点。

如果您正在使用,那么您有一个可用的语句。解析器生成事件并填充可供您访问的内容。(由于某些原因,最后一个链接不能正常工作,应该将您带到该页面上的“控制流”标记)

如果需要“删减”树结构的某些部分,包括标记和数据,那么可能需要解析原始结构,填充结构,并使用来获取所需的XML数据流。解析器似乎不会告诉您每个事件在原始XML数据流中发生的位置,至少似乎没有一个特殊的寄存器来填充该值。

如果您正在使用,那么就有一个可用的语句。解析器生成事件并填充可供您访问的内容。(由于某些原因,最后一个链接不能正常工作,应该将您带到该页面上的“控制流”标记)


如果需要“删减”树结构的某些部分,包括标记和数据,那么可能需要解析原始结构,填充结构,并使用来获取所需的XML数据流。看起来解析器不会告诉您每个事件在原始XML数据流中发生的位置,至少似乎没有一个特殊的寄存器填充该值。

COBOL XML PARSE不提供位置信息(AFAIK)。确定偏移位置,其中 不可能发生给定的事件。感兴趣标记的文本搜索 肯定会导致一大堆的问题-甚至不要想去那里

我能想到的下一种可能性是在解析过程中构造感兴趣的XML片段文档 原始文件。片段完成后,将其写入XML数据库

<a>
  <mynode >
   <c>Content</c>
   <c>More content</c>
  </mynode >
</a>
下面的示例程序说明了如何进行此操作。这个节目需要一段时间 XML-SOURCE文档并对其进行解析,查找感兴趣的事件(例如“b”标记)。当这样的标签 它开始构建一个片段文档(XML-fragment),直到找到结束标记。在 此时将输出片段,并开始搜索下一个片段

   IDENTIFICATION DIVISION.                   
   PROGRAM-ID. XMLTEST.                       
   DATA DIVISION.                             
   WORKING-STORAGE SECTION.

   77  XL                   PIC S9(4) BINARY. 

   01.                      PIC X.            
       88 XML-EXTRACT-NO    VALUE 'N'.        
       88 XML-EXTRACT-YES   VALUE 'Y'.        

   01.                                        
       05 XML-FRAGMENT      PIC X(8000).      
       05 XML-CHARS         PIC S9(4) BINARY. 

   01  XML-SOURCE           PIC X(8000). 

   PROCEDURE DIVISION.                                         
   MAINLINE SECTION.   

       MOVE '<a><b><c>Content</c><c>More content</c></b></a>'
         TO XML-SOURCE                                         

       SET XML-EXTRACT-NO TO TRUE                              
       XML PARSE XML-SOURCE                                    
           PROCESSING PROCEDURE XTRACT                         
       GOBACK                                                  
       .                                                       
   XTRACT SECTION.                                             
       COMPUTE XL = FUNCTION LENGTH (XML-TEXT)                 
       EVALUATE XML-EVENT                                      
       WHEN 'START-OF-ELEMENT'
  *
  *       New XML element: Ignore it, add to existing fragment
  *       or start a new fragment...
  *                                                                 
          IF XML-TEXT(1:XL) = 'b' OR XML-EXTRACT-YES           
             IF XML-EXTRACT-NO                                 
                MOVE ZERO TO XML-CHARS                         
                SET XML-EXTRACT-YES TO TRUE                    
             END-IF                                            
             STRING '<' XML-TEXT(1:XL) '>' DELIMITED BY SIZE        
               INTO XML-FRAGMENT(XML-CHARS + 1 : XL + 2)            
             COMPUTE XML-CHARS = XML-CHARS + XL + 2                 
          END-IF                                                    
       WHEN 'END-OF-ELEMENT'
  *
  *       End of event: Add to XML fragment, ignore fragment or
  *                     output complete fragment and start search
  *                     for a new one...
  *                                        
          IF XML-EXTRACT-YES                                        
             STRING '</' XML-TEXT(1:XL) '>' DELIMITED BY SIZE       
               INTO XML-FRAGMENT(XML-CHARS + 1 : XL + 3)            
             COMPUTE XML-CHARS = XML-CHARS + XL + 3                 
          END-IF

          IF XML-TEXT(1:XL) = 'b'                                   
  *                                                                 
  *          End of fragment write to database (or whatever)               
  *                                                                 
             DISPLAY XML-FRAGMENT(1:XML-CHARS) 
             SET XML-EXTRACT-NO TO TRUE        
          END-IF
       WHEN 'CONTENT-CHARACTERS'
  *
  *       Add event data to fragment or just ignore it...
  *
  *       Depening on the structure of your XML docuemnt you may
  *       need to react to addtional EVENTS such as CDATA to ensure
  *       proper tag construction.
  *
          IF XML-EXTRACT-YES                                        
             MOVE XML-TEXT(1:XL) TO XML-FRAGMENT(XML-CHARS + 1 : XL)
             COMPUTE XML-CHARS = XML-CHARS + XL                     
          END-IF                                                    

       END-EVALUATE                            
       .                                       
识别部门。
PROGRAM-ID.XMLTEST。
数据司。
工作和储存科。
77 XL PIC S9(4)二进制。
1图十。
88 XML-EXTRACT-NO值“N”。
88 XML-EXTRACT-YES值“Y”。
1
05 XML片段PIC X(8000)。
05 XML-CHARS PIC S9(4)二进制文件。
01 XML源PIC X(8000)。
程序司。
主线部分。
移动“内容更多内容”
到XML源代码
将XML-EXTRACT-NO设置为TRUE
XML解析XML源代码
处理程序
戈巴克
.                                                       
摘录部分。
计算XL=函数长度(XML-TEXT)
评估XML事件
当“元素的开始”
*
*新XML元素:忽略它,添加到现有片段
*或者开始一个新的片段。。。
*                                                                 
如果XML-TEXT(1:XL)=“b”或XML-EXTRACT-YES
如果XML-EXTRACT-NO
将零移动到XML-CHARS
将XML-EXTRACT-YES设置为TRUE
端到端IF
由大小分隔的字符串“”
转换为XML片段(XML-CHARS+1:XL+2)
计算XML-CHARS=XML-CHARS+XL+2
端到端IF
当“元素结束时”
*
*事件结束:添加到XML片段,忽略片段或
*输出完整片段并开始搜索
*为了一个新的。。。
*                                        
如果XML-EXTRACT-YES
s
 <b><c>Content</c><c>More content</c></b>