# Example 3 This example program demonstrates the basic structure of an RPG program utilizing the RXS DOM parser to parse an XML document with multiple repeating elements. ### Free Format EX3.rpgle ```rpgle **FREE Ctl-Opt ActGrp(*Caller) BndDir('RXSBND') Option(*NoDebugIO) ExtBinInt(*Yes) DecEdit('0.') Text('Ex. 3 - XML DOM Parsing'); /COPY QRPGLECPY,RXSCB Dcl-Ds gRootDomDS LikeDS(RXS_ParseDomDS_t); Dcl-Ds gBookDomDS LikeDS(RXS_ParseDomDS_t); Dcl-Ds gReviewDomDS LikeDS(RXS_ParseDomDS_t); Dcl-S gXml Like(RXS_Var64Kv_t); Dcl-S gData Like(RXS_Var64Kv_t); Dcl-S gXPath Like(RXS_Var8Kv_t); Dcl-S x Uns(10); Dcl-S y Uns(10); monitor; gXml = '' + '' + '' + '<![CDATA[Charlotte''s Web]]>' + 'E. B. White' + '1952' + '5.99' + 'What a great book!' + 'Highly recommended.' + '' + '' + 'Everyday Italian' + 'Giada De Laurentiis' + '2005' + '30.00' + '' + '' + 'Gideon the Ninth' + 'Tamsyn Muir' + '2019' + '19.99' + '' + ''; 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; return; ``` ### Fixed Format FX_EX3.rpgle ```rpgle H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('RXSBND') OPTION(*NODEBUGIO) H EXTBININT(*YES) DECEDIT('0.') H TEXT('Fixed Format Ex. 3 - XML DOM Parsing') /COPY QRPGLECPY,RXSCB D gRootDomDS DS LikeDS(RXS_ParseDomDS_t) D gBookDomDS DS LikeDS(RXS_ParseDomDS_t) D gReviewDomDS DS LikeDS(RXS_ParseDomDS_t) D gXml S Like(RXS_Var64Kv_t) D gData S Like(RXS_Var64Kv_t) D gXPath S Like(RXS_Var8Kv_t) D x S 10U 0 D y S 10U 0 /free monitor; gXml = '' + '' + '' + '<![CDATA[Charlotte''s Web]]>' + 'E. B. White' + '1952' + '5.99' + 'What a great book!' + 'Highly recommended.' + '' + '' + 'Everyday Italian' + 'Giada De Laurentiis' + '2005' + '30.00' + '' + '' + 'Gideon the Ninth' + 'Tamsyn Muir' + '2019' + '19.99' + '' + ''; 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; return; /end-free ```