DOMRECUR

This example program demonstrates the basic structure of an RPG program utilizing the RPG-XML Suite DOM parser to parse an XML document with multiple repeating elements.

     H BNDDIR('RXSBND') DFTACTGRP(*NO) ACTGRP(*CALLER)
      /copy qrpglecpy,rxscb
     D gRootDomDS      DS                  LikeDS(RXS_ParseDomDS_t) Inz
     D gBookDomDS      DS                  LikeDS(RXS_ParseDomDS_t) Inz
     D gReviewDomDS    DS                  LikeDS(RXS_ParseDomDS_t) Inz
     D gXml            S          65535A   Varying(4)
     D gData           S          65535A   Varying(4)
     D gXPath          S                   Like(RXS_Var8Kv_t)
     D x               S             10U 0
     D y               S             10U 0
      /free
       monitor;

         gXml = '<?xml version="1.0" encoding="UTF-8"?>' +
           '<bookstore xmlns:test="testnamespace">' +
           '<book category="children">' +
           '<title lang="en"><![CDATA[Charlotte''s Web]]></title>' +
           '<author>E. B. White</author>' +
           '<year>1952</year>' +
           '<price>5.99</price>' +
           '<review><text>What a great book!</text></review>' +
           '<review><text>Highly recommended.</text></review>' +
           '</book>' +
           '<book category="cooking">' +
           '<title lang="en">Everyday Italian</title>' +
           '<author>Giada De Laurentiis</author>' +
           '<year>2005</year>' +
           '<price>30.00</price>' +
           '</book>' +
           '<book category="science fiction">' +
           '<title lang="en">Gideon the Ninth</title>' +
           '<author>Tamsyn Muir</author>' +
           '<year>2019</year>' +
           '<price>19.99</price>' +
           '</book>' +
           '</bookstore>';

         gRootDomDS = RXS_OpenDom(  gXml );
         gXPath = RXS_XPath( '/*:bookstore/*:book' );
         gBookDomDS = RXS_ParseDomToDom( gXPath : gRootDomDS );

         for x = 1 to gBookDomDS.NodeCount;

           gXPath = RXS_XPath( '*:book[%u]/*:title' : x );
           gData = RXS_ParseDomToText( gXPath : gBookDomDS );
           RXS_JobLog( 'Title: %s' : gData );
           gXPath = RXS_XPath( '*:book[%u]/*:review' : x );
           gReviewDomDS = RXS_ParseDomToDom( gXPath : gBookDomDS );

           for y = 1 to gReviewDomDS.NodeCount;

             gXPath = RXS_XPath( '*:review[%u]/*:text' : y );
             gData = RXS_ParseDomToText( gXPath : gReviewDomDS );
             RXS_JobLog( 'Review: %s' : gData );

           endfor;

         endfor;

         RXS_CloseDom( gRootDomDS );

       on-error;

       endmon;

       *INLR = *ON;

      /end-free