Openedge - 从URL读取XML

时间:2014-04-05 10:22:07

标签: xml progress-4gl openedge

我需要从URL读取XML文件。如果文件存在,我没有问题。然后我使用SAX阅读器解析它。

现在我需要从URL读取一个XML文件 - 两次。

首次需要从http://someurl/paging$1,1获取,然后从文档头部的total-items中提取值。

之后,我需要从同一个网址获取XML,只有最后1替换为来自total-items的值。通过这种方式,我可以获得所有可用的项目。

现在我已经在开始时难过了。如何从URL读取XML?我看到有一个READ-XML()选项,但是它将它存储在临时表中。

使用Progress Openedge ver。 11

2 个答案:

答案 0 :(得分:2)

READ-XML要求XML数据位于存储区域,例如LONGCHAR,MEMPTR,FILE或句柄。

为了在您的应用程序中使用此功能,您需要将xml有效负载d / l到其中一个存储区域,然后将其读入。

一种可能性是创建SOCKET,使用套接字对http请求执行“get”调用,读取对MEMPTR的响应,然后将数据READ-XML到TT中。

另一个选择是使用“curl”(http://curl.haxx.se/)将XML数据传递到READ-XML存储区域,然后以这种方式解析XML文件。

答案 1 :(得分:2)

对于" raw" xml支持您可以使用X-DOCUMENT句柄。

DEFINE VARIABLE hXDoc AS HANDLE      NO-UNDO.
CREATE X-DOCUMENT hXDoc.
hXDoc:LOAD("file","http://someurl/paging$1,1", TRUE).
/* Here you need to parse */
DELETE OBJECT hXDoc.

根据xml文档的结构,您可以将READ-XML与临时表或数据集一起使用,以将数据直接加载到其中。但是之后您需要先定义数据集。这通常不适合动态创建的项目。

查看xml here

周围的文档

如果所有事情都失败了,你可以包括像curl或wget这样的os实用程序(关于Tims的回答)。围绕wget的简单包装可能看起来像这样(curl会类似):

DEFINE INPUT  PARAMETER pcUrl     AS CHARACTER   NO-UNDO.
DEFINE INPUT  PARAMETER pcPrefix  AS CHARACTER   NO-UNDO.
DEFINE OUTPUT PARAMETER pcFile    AS CHARACTER   NO-UNDO.

pcFile = "wget." + pcPrefix + "." + STRING(TODAY,"999999") + REPLACE(STRING(TIME,"HH:MM:SS"),":","") + "-" + STRING(RANDOM(0,1000),"9999"). 

OS-COMMAND SILENT VALUE("wget '" + pcUrl + "' -o /dev/null -O /tmp/" + pcFile).