2014-04-05 79 views
2

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

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

第一次需要从http://someurl/paging$1,1得到它,然后从文档头部的total-items中提取值。

之后,我需要从相同的URL获取XML,只有最后1取代从total-items值。这样我就可以获得所有可用的物品。

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

使用Progress Openedge ver。 11

回答

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

如果所有的东西失败,你可以换一样卷曲或wget的一个操作系统实用程序(如关于蒂姆斯答案)的文档。围绕wget的一个简单的包装可能看起来像这样(卷曲会类似):

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). 
+0

这工作得很好,但只有当我有远程XML的名称。在这种情况下,我不会和hxDoc:LOAD失败。 – Corwin

+0

这与解析XML有关,对吧?我不完全认为我明白你想要做什么。也许你可以澄清一点?包括例子总是有帮助的! – Jensd

+0

不,它无法从'hXDoc:LOAD(“file”,“http:// myurl/paging $ 1,1”,TRUE)'上从源代码获取xml。如果我将这个URL粘贴到Web浏览器中,我会在屏幕上获得输出XML。现在,如果我尝试你的例子与我的其他来源,其中有一个XML名称 - 'hXDoc:LOAD(“文件”,“http://myotherurl/products.xml”,TRUE)'然后它的作品。我用'hXDoc:SAVE(...)'保存x-doc,并让现有的SAX解析器接管。我认为问题在于我没有访问该远程系统上的实际文件,而是调用了将生成的xml反馈回的Web服务...如果那有意义的话。 – Corwin

2

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

为了使用与您的应用程序这个功能,你需要d /升的XML有效载荷的存储区域中,然后在读它。

一种可能性是创建一个Socket ,使用套接字为http请求执行“get”调用,读取对MEMPTR的响应,然后将数据读取到XML中并将其写入您的TT中。

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

+0

卷曲与 - 压缩标志提供没有毛刺(到文件)。与来自@Jensd的包装指针/代码一起,我的问题得到解决。坚韧的标志,回答。 – Corwin

+0

你仍然可以赞成他们两人。 –