XMLParserService 2 (Node traversal)
This is a more complex XMLParserService example that demonstrates the node traversal of received xml. The direct binding of received xml to LANSA fields and lists obviates the need to perform node traversal in most situations (refer to HTTPService service). This example parses xml and allows traversal of the nodes in the DOM tree to load node attribute values.
********** Beginning of RDML commands **********
FUNCTION OPTIONS(*DIRECT)
**********
DEFINE FIELD(#JSMSTS) TYPE(*CHAR) LENGTH(20)
DEFINE FIELD(#JSMMSG) TYPE(*CHAR) LENGTH(255)
DEFINE FIELD(#JSMCMD) TYPE(*CHAR) LENGTH(255)
**********
DEFINE FIELD(#MESSAGE) TYPE(*CHAR) LENGTH(255)
DEF_LIST NAME(#MSGLST) FIELDS((#MESSAGE)) TYPE(*WORKING)
**********
********** 'Open service'
**********
USE BUILTIN(JSM_OPEN) TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
**********
********** 'Load service'
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('SERVICE_LOAD SERVICE(XM
LPARSERSERVICE)') TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
**********
********** 'Load XML source'
**********
********** Load from a file
CHANGE FIELD(#JSMCMD) TO('LOAD METHOD(*FILE) FILE(order.xml)')
USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS
#JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
**********
********** 'Parse XML'
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('PARSE') TO_GET(#JSMSTS
#JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
**********
********** 'Get ROOT tag'
USE BUILTIN(JSM_COMMAND) WITH_ARGS('GET OBJECT(*ROOTTAGNAME
)') TO_GET(#JSMSTS #JSMMSG)
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
********** Get warning and error messages
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('GET OBJECT(*MESSAGES) S
ERVICE_LIST(MESSAGE)') TO_GET(#JSMSTS #JSMMSG #MSGLST)
**********
SELECTLIST NAMED(#MSGLST)
DISPLAY FIELDS((#MESSAGE))
ENDSELECT
********** 'Get node value'
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('GET NODE(/SALESORDER/CU
STOMER/CUSTNAME)') TO_GET(#JSMSTS #JSMMSG )
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
********** 'Collect SALESORDER/LINE elements'
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('FOREACH NODE(/SALESORDE
R/LINE)') TO_GET(#JSMSTS #JSMMSG)
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
Part 2
********** 'Loop through Line elements'
**********
BEGIN_LOOP
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('NEXT OBJECT(*NODE)') TO
_GET(#JSMSTS #JSMMSG)
**********
IF COND('#JSMSTS *NE OK')
GOTO LABEL(BRK)
ENDIF
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('GET NODE(*CURRENT) ATTR
IBUTE(LineNumber)') TO_GET(#JSMSTS #JSMMSG)
**********
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
CHANGE FIELD(#JSMCMD) TO('GET NODE(PART) ATTRIBUTE(PARTNUMBER)
')
USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS
#JSMMSG)
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('GET NODE(PART/DESCRIPTI
ON)') TO_GET(#JSMSTS #JSMMSG)
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
END_LOOP
BRK ********** 'Loop breakout
**********
********** 'Unload service'
**********
USE BUILTIN(JSM_COMMAND) WITH_ARGS('SERVICE_UNLOAD') TO_GET
(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
**********
********** 'Close service'
**********
USE BUILTIN(JSM_CLOSE) TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
**********
********** SUB ROUTINES
**********
SUBROUTINE NAME(CHECK) PARMS((#JSMSTS *RECEIVED) (#JSMMSG *RECEIVE
D))
**********
IF COND('#JSMSTS *NE OK')
DISPLAY FIELDS((#JSMSTS) (#JSMMSG))
**********
USE BUILTIN(JSM_CLOSE) TO_GET(#JSMSTS #JSMMSG)
**********
MENU MSGTXT('Java service error has occurred')
**********
ENDIF
**********
ENDROUTINE