This is an example to use web-services with 4GL which parse a XML.
to white ...
ll = result:WRITE-XML ("LONGCHAR",lcDoc,YES,?,?,YES,FALSE,TRUE).
ll = result:WRITE-XML ("FILE","c:\tmp\toto",YES,?,?,YES,FALSE,TRUE).
take a look to the "WRITE-XML" in the standard OpenEdge documentation.
Code:
/*******************************************************************/
/* client_IP2Location.p */
/*******************************************************************/
DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hPortType AS HANDLE NO-UNDO.
DEFINE VARIABLE cResponse AS CHARACTER NO-UNDO.
DEFINE VARIABLE li AS INTEGER NO-UNDO.
DEFINE VARIABLE retValue AS CHARACTER INITIAL "OK" NO-UNDO.
DEFINE VARIABLE err AS LOGICAL NO-UNDO.
DEFINE VARIABLE result AS LONGCHAR NO-UNDO.
DEFINE VARIABLE currentContent AS CHARACTER NO-UNDO.
DEFINE VARIABLE currentElement AS CHARACTER NO-UNDO.
DEFINE STREAM ls.
/*******************************************************************/
CREATE SERVER hWebService.
ETIME(true).
li = MTIME.
hWebService:CONNECT("-WSDL 'http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl'
-Service IP2Geo
-Port IP2GeoSoap").
IF NOT hWebService:CONNECTED() THEN DO:
MESSAGE "SERVER NOT CONNECTED" VIEW-AS ALERT-BOX.
retValue = "ERROR".
END.
RUN IP2GeoSoap SET hPortType ON SERVER hWebService NO-ERROR.
IF ERROR-STATUS:ERROR THEN DO:
MESSAGE "Failed to create hPortType" VIEW-AS ALERT-BOX.
retValue = "ERROR".
END.
DEFINE VARIABLE monIp AS CHARACTER NO-UNDO.
INPUT-OUTPUT STREAM ls THROUGH VALUE ("monip.sh") NO-ECHO UNBUFFERED.
REPEAT:
IMPORT STREAM ls UNFORMATTED monIp.
END.
INPUT-OUTPUT STREAM ls CLOSE.
monIp = TRIM(monIp).
RUN ResolveIP IN hPortType (
INPUT monIp,
INPUT "0",
OUTPUT result) NO-ERROR.
RUN ErrorInfo (OUTPUT err).
IF NOT err THEN DO:
DEFINE VARIABLE hParser as HANDLE.
CREATE SAX-READER hParser.
hParser:HANDLER = THIS-PROCEDURE.
hParser:SET-INPUT-SOURCE("LONGCHAR", result).
hParser:SAX-PARSE( ) NO-ERROR.
DELETE OBJECT hParser.
END.
ELSE DO:
retValue = "ERROR".
END.
DELETE PROCEDURE hPortType.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.
QUIT.
/*******************************************************************/
PROCEDURE StartElement:
DEFINE INPUT PARAMETER namespaceURI AS CHARACTER.
DEFINE INPUT PARAMETER localName AS CHARACTER.
DEFINE INPUT PARAMETER qname AS CHARACTER.
DEFINE INPUT PARAMETER attributes AS HANDLE.
currentElement = localName.
END.
/*******************************************************************/
PROCEDURE Characters:
DEFINE INPUT PARAMETER charData AS MEMPTR.
DEFINE INPUT PARAMETER numChars AS INTEGER.
currentContent = GET-STRING(charData, 1, GET-SIZE(charData)).
IF LENGTH(TRIM(currentContent)) > 0 THEN
MESSAGE monIp + ": " + currentElement + "=" + currentContent VIEW-AS ALERT-BOX.
END.
/*******************************************************************/
PROCEDURE ErrorInfo:
DEFINE OUTPUT PARAMETER errorfound AS LOGICAL INITIAL FALSE.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE hSOAPFault AS HANDLE NO-UNDO.
DEFINE VARIABLE hSOAPFaultDetail AS HANDLE NO-UNDO.
DEFINE VARIABLE HeaderXML AS LONGCHAR VIEW-AS EDITOR SIZE 70 BY 15 LARGE.
IF ERROR-STATUS:NUM-MESSAGES > 0 THEN DO:
errorfound = TRUE.
DO i = 1 TO ERROR-STATUS:NUM-MESSAGES:
MESSAGE ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX.
END.
IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO:
hSOAPFault = ERROR-STATUS:ERROR-OBJECT-DETAIL.
MESSAGE
"Fault Code: " hSOAPFault:SOAP-FAULT-CODE SKIP
"Fault String: " hSOAPFault:SOAP-FAULT-STRING SKIP
"Fault Actor: " hSOAPFault:SOAP-FAULT-ACTOR SKIP
"Error Type: " hSOAPFault:TYPE VIEW-AS ALERT-BOX.
IF VALID-HANDLE(hSOAPFault:SOAP-FAULT-DETAIL) THEN DO:
hSOAPFaultDetail = hSOAPFault:SOAP-FAULT-DETAIL.
MESSAGE "Error Type: " hSOAPFaultDetail:TYPE
VIEW-AS ALERT-BOX.
HeaderXML = hSOAPFaultDetail:GET-SERIALIZED().
DISPLAY HeaderXML LABEL "Serialized SOAP fault detail"
WITH FRAME a.
END.
END.
END.
END PROCEDURE.
/*******************************************************************/