Example: program for processing XML

This example shows the parsing of an XML document, and a processing procedure that reports the various XML events and their associated text fragments.

The XML document is shown in the program source to make it easier to follow the flow of the parsing. The output of the program is shown after the example.

To understand the interaction of the parser and the processing procedure, and to match events to document fragments, compare the XML document to the output of the program.

Process codepage(1047)
       Identification division.
         Program-id. XMLSAMPL.
       Data division.
        Working-storage section.
      ******************************************************************
      * XML document data, encoded as initial values of data items.    *
      ******************************************************************
         1 xml-document-data.
          2 pic x(39) value '<?xml version="1.0" encoding="UTF-8"'.
          2 pic x(19) value ' standalone="yes"?>'.
          2 pic x(39) value '<!--This document is just an example-->'.
          2 pic x(10) value '<sandwich>'.
          2 pic x(33) value '<bread type="baker&apos;s best"/>'.
          2 pic x(36) value '<?spread We'll use real mayonnaise?>'.
          2 pic x(29) value '<meat>Ham &amp; turkey</meat>'.
          2 pic x(34) value '<filling>Cheese, lettuce, tomato, '.
          2 pic x(32) value 'and that's all, Folks!</filling>'.
          2 pic x(25) value '<![CDATA[We should add a '.
          2 pic x(20) value '<relish> element!]]>'.
          2 pic x(28) value '<listprice>$4.99</listprice>'.
          2 pic x(25) value '<discount>0.10</discount>'.
          2 pic x(31) value '</sandwich>'.
      ******************************************************************
      * XML document, represented as fixed-length records.             *
      ******************************************************************
         1 xml-document redefines xml-document-data.
          2 xml-segment pic x(40) occurs 10 times.
         1 xml-segment-no comp pic s9(4).
         1 content-buffer pic x(100).
         1 current-element-stack.
          2 current-element pic x(30) occurs 10 times.
      ******************************************************************
      * Sample data definitions for processing numeric XML content.    *
      ******************************************************************
         1 element-depth comp pic s9(4).
         1 discount computational pic 9v99 value 0.
         1 display-price pic $$9.99.
         1 filling pic x(4095).
         1 list-price computational pic 9v99 value 0.
         1 ofr-ed pic x(9) justified.
         1 ofr-ed-1 redefines ofr-ed pic 999999.99.
       Procedure division.
        Mainline section.
           Move 1 to xml-segment-no
           Display 'Initial segment {' xml-segment(xml-segment-no) '}'
           Display ' '
           XML parse xml-segment(xml-segment-no)
               processing procedure XML-handler
             On exception
               Display 'XML processing error, XML-Code=' XML-Code '.'
               Move 16 to return-code
               Goback
             Not on exception
               Display 'XML document successfully parsed.'
           End-XML
      ******************************************************************
      * Process the transformed content and calculate promo price.     *
      ******************************************************************
           Display ' '
           Display '-----+++++***** Using information from XML '
               '*****+++++-----'
           Display ' '
           Move list-price to Display-price
           Display ' Sandwich list price: ' Display-price
           Compute Display-price = list-price * (1 - discount)
           Display ' Promotional price: ' Display-price
           Display ' Get one today!'
           Goback.
        XML-handler section.
           Evaluate XML-Event
      * ==> Order XML events most frequent first
             When 'START-OF-ELEMENT'
               Display 'Start element tag: {' XML-Text '}'
               Add 1 to element-depth
               Move XML-Text to current-element(element-depth)
             When 'CONTENT-CHARACTERS'
               Display 'Content characters: {' XML-Text '}'
      * ==> In general, a split can occur for any element or attribute
      * ==> data, but in this sample, it only occurs for "filling"...
               If xml-information = 2 and
                   current-element(element-depth) not = 'filling'
                 Display 'Unexpected split in content for element '
                     current-element(element-depth)
                 Move -1 to xml-code
               End-if
      * ==> Transform XML content to operational COBOL data item...
               Evaluate current-element(element-depth)
                 When 'filling'
      * ==> After reassembling separate pieces of character content...
                   String xml-text delimited by size into
                       content-buffer with pointer tally
                     On overflow
                       Display 'content buffer ('
                           length of content-buffer
                           ' bytes) is too small'
                       Move -1 to xml-code
                   End-string
                   Evaluate xml-information
                     When 2
                       Display '  Character data for element "filling" '
                           'is incomplete.'
                       Display '  The partial data was buffered for '
                           'content assembly.'
                     When 1
                       subtract 1 from tally
                       move content-buffer(1:tally) to filling
                       Display '  Element "filling" data (' tally
                           ' bytes) is now complete:'
                       Display '  {' filling(1:tally) '}'
                   End-evaluate
                 When 'listprice'
      * ==> Using function NUMVAL-C...
                   Move XML-Text to content-buffer
                   Compute list-price =
                       function numval-c(content-buffer)
                 When 'discount'
      * ==> Using de-editing of a numeric edited item...
                   Move XML-Text to ofr-ed
                   Move ofr-ed-1 to discount
               End-evaluate
             When 'END-OF-ELEMENT'
               Display 'End element tag: {' XML-Text '}'
               Subtract 1 from element-depth
             When 'END-OF-INPUT'
               Display 'End of input'
               Add 1 to xml-segment-no
               Display '  Next segment: {' xml-segment(xml-segment-no)
                   '}'
               Display ' '
               Move 1 to xml-code
             When 'START-OF-DOCUMENT'
               Display 'Start of document'
               Move 0 to element-depth
               Move 1 to tally
             When 'END-OF-DOCUMENT'
               Display 'End of document.'
             When 'VERSION-INFORMATION'
               Display 'Version: {' XML-Text '}'
             When 'ENCODING-DECLARATION'
               Display 'Encoding: {' XML-Text '}'
             When 'STANDALONE-DECLARATION'
               Display 'Standalone: {' XML-Text '}'
             When 'ATTRIBUTE-NAME'
               Display 'Attribute name: {' XML-Text '}'
             When 'ATTRIBUTE-CHARACTERS'
               Display 'Attribute value characters: {' XML-Text '}'
             When 'ATTRIBUTE-CHARACTER'
               Display 'Attribute value character: {' XML-Text '}'
             When 'START-OF-CDATA-SECTION'
               Display 'Start of CData section'
             When 'END-OF-CDATA-SECTION'
               Display 'End of CData section'
             When 'CONTENT-CHARACTER'
               Display 'Content character: {' XML-Text '}'
             When 'PROCESSING-INSTRUCTION-TARGET'
               Display 'PI target: {' XML-Text '}'
             When 'PROCESSING-INSTRUCTION-DATA'
               Display 'PI data: {' XML-Text '}'
             When 'COMMENT'
               Display 'Comment: {' XML-Text '}'
             When 'EXCEPTION'
               Compute tally = function length (XML-Text)
               Display 'Exception ' XML-Code ' at offset ' tally '.'
             When other
               Display 'Unexpected XML event: ' XML-Event '.'
           End-evaluate
           .
       End program XMLSAMPL.

Output from parsing

From the following output you can see which fragments of the document were associated with the events that occurred during parsing:


 Start of document                                                           
 Version: {1.0}                                                              
 Encoding: {UTF-8}                                                        
 Standalone: {yes}                                                           
 Comment: {This document is just an example}                                 
 Start element tag: {sandwich}                                               
 Content characters: {  }                                                    
 Start element tag: {bread}                                                  
 Attribute name: {type}                                                      
 Attribute value characters: {baker}                                         
 Attribute value character: {'}                                              
 Attribute value characters: {s best}                                        
 End element tag: {bread}                                                    
 Content characters: {  }                                                    
 PI target: {spread}                                                         
 PI data: {please use real mayonnaise  }                                     
 Content characters: {  }                                                    
 Start element tag: {meat}                                                   
 Content characters: {Ham }                                                  
 Content character: {&}                                                      
 Content characters: { turkey}                                               
 End element tag: {meat}                                                     
 Content characters: {  }                                                    
 Start element tag: {filling}                                                
 Content characters: {Cheese, lettuce, tomato, etc.}                         
 End element tag: {filling}                                                  
 Content characters: {  }                    
 Start of CData: {<![CDATA[}                                                 
 Content characters: {We should add a <relish> element in future!}           
 End of CData: {]]>}                                                         
 Content characters: {  }                                                    
 Start element tag: {listprice}                                              
 Content characters: {$4.99 }                                                
 End element tag: {listprice}                                                
 Content characters: {  }                                                    
 Start element tag: {discount}                                               
 Content characters: {0.10}                                                  
 End element tag: {discount}                                                 
 End element tag: {sandwich}                                                 
 End of document.                                                            
 XML document successfully parsed                                            
                                                                             
 -----+++++***** Using information from XML *****+++++-----                  
                                                                             
   Sandwich list price:  $4.99                                               
   Promotional price:    $4.49                                               
   Get one today!                                                            

Related concepts  
XML events  

Related references  
XML-EVENT (COBOL for Linux® on x86 Language Reference)