XMLParserServiceの例2 (ノードのトラバース)
これは、比較的複雑なXMLParserServiceの例で、受信したxmlのノードのトラバースを実証します。受信したxmlとLANSAフィールドおよびリストを直接バインドする場合、ほとんどの状況でノードをトラバースする必要がなくなります(HTTPServiceサービスを参照)。この例では、xmlを解析し、DOMツリー内でノードをトラバースしてノードの属性値をロードします。
********** 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