首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OpenEdge Progress4GL中将XML响应转换为临时表?

如何在OpenEdge Progress4GL中将XML响应转换为临时表?
EN

Stack Overflow用户
提问于 2020-05-10 11:09:21
回答 1查看 524关注 0票数 1

你好,Progress4GL开发人员

我试图使用进度来使用SOAP。目前,我正在使用一个名为:http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL的开源示例SOAP服务。

下面的程序实现了一个梦想(即用户输入国家代码,例如"ESP“,并向用户显示有关西班牙的详细信息)。结果存储在temp-表1和temp-表2中:

代码语言:javascript
复制
/******* Sample Application to show Progress4GL Consuming a SOAP API *************/

/******* VARIABLES ***************************************************************/
DEFINE VARIABLE lReturn AS LOGICAL NO-UNDO.
DEFINE VARIABLE hServer AS HANDLE NO-UNDO.
DEFINE VARIABLE hPortType AS HANDLE NO-UNDO.
DEFINE VARIABLE capitalCity as LONGCHAR NO-UNDO.

DEFINE VARIABLE iCntryCode as char no-undo label "Country Code".
DEFINE VARIABLE oResponse as LONGCHAR no-undo.

/******* CONNECTION SETTINGS TO SOAP SERVICE *************************************/
CREATE SERVER hServer.
lReturn = hServer:CONNECT("-WSDL http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"). 

IF lReturn = NO THEN DO:
 MESSAGE
  "Could not connect to WebService server".
 END.

/******* SETTING PORT TYPE *******************************************************/
RUN CountryInfoServiceSoapType SET hPortType ON SERVER hServer.

IF NOT VALID-HANDLE(hPortType) THEN DO:
 MESSAGE
  "Could not establish portType".
 END.

/****** USER UPDATE FORM**********************************************************/
UPDATE iCntryCode. 

/****** NAME OF DATA FUNCTION TO RUN *********************************************/
RUN FullCountryInfo IN hPortType (INPUT iCntryCode, OUTPUT oResponse) NO-ERROR.

/****** TEMP TABLE TO HOLD ALL CAPITAL CITY FIELDS *******************************/
DEFINE TEMP-TABLE temptable1 
SERIALIZE-NAME "sCapitalCity" 
    FIELD capitalCity AS CHAR XML-NODE-TYPE "text". 

/****** DATASET WHICH RUNS CONVERSION ********************************************/
DEFINE DATASET dsa SERIALIZE-NAME "FullCountryInfoResult" FOR temptable1. 

/***** TEMP TABLE TO HOLD ALL CURRENCY FIELDS ************************************/
DEFINE TEMP-TABLE temptable2 
SERIALIZE-NAME "sCurrencyISOCode" 
    FIELD currencyCode AS CHAR XML-NODE-TYPE "text". 

/****** DATASET WHICH RUNS CONVERSION ********************************************/
DEFINE DATASET dsb SERIALIZE-NAME "FullCountryInfoResult" FOR temptable2.

/****** POPULATE DATASET AND TEMP-TABLES FROM SOAP RESPONSE **********************/
DATASET dsa:READ-XML( "longchar", oResponse, ?, ?, ? ). 
DATASET dsb:READ-XML( "longchar", oResponse, ?, ?, ? ).

FOR EACH temptable1 no-lock, each temptable2 no-lock:
  DISPLAY temptable1.capitalcity temptable2.currencyCode.
END.

PAUSE 100.

/****** STOP CONNECTION TO SERVER ************************************************/
DELETE PROCEDURE hPortType.
  hServer:DISCONNECT().
  DELETE OBJECT hServer.

然而,这个示例web服务也有一个叫做FullCountryInfoAllCountries的过程。这将对所有国家作出反应。我试图重新分析上面的代码,以便所有临时表1和临时表2都包含所有国家,但是我在解析XML数据时遇到了困难。

我尝试过使用命名空间URI、序列化名称和XML-节点名称语句,但无法使其工作。我遇到的问题是,来自FullCountryInfoAllCountries的XML响应的结构与FullCountryInfo不同,而且我总是收到一个类似于'Namespace‘的错误,否则它将在临时表中什么也不返回。

事先非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-10 13:11:16

您可以通过消息传递响应(注释掉)查看输出,然后将其映射到数据集、临时表和字段名:

代码语言:javascript
复制
define variable hs as handle no-undo.
define variable hp as handle no-undo.
define variable lcresponse as longchar no-undo.

define temp-table tt serialize-name "tCountryInfo" 
   field sISOCode as character
   field sName    as character
   .

define dataset ds serialize-name "FullCountryInfoAllCountriesResult" for tt. 

create server hs.
hs:connect( "-WSDL http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL" ). 

run CountryInfoServiceSoapType set hp on server hs.

run FullCountryInfoAllCountries in hp ( output lcresponse ).

// message string( substring( lcresponse, 1, 30000 ).

dataset ds:read-xml( "longchar", lcresponse, ?, ?, ? ). 

for each tt:
  display tt.
end.

delete procedure hp.
hs:disconnect().
delete object hs.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61710981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档