# 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 = ''
+ ''
+ ''
+ ''
+ '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 = ''
+ ''
+ ''
+ ''
+ '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
```