【问题标题】:Openedge - Read XML from URLOpenedge - 从 URL 读取 XML
【发布时间】:2014-05-17 18:10:00
【问题描述】:

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

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

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

之后,我需要从同一个 url 获取 XML,只是将最后一个 1 替换为来自 total-items 的值。这样我就可以得到所有可用的项目。

现在我一开始就被难住了。如何在从 URL 读取 XML 方面取得进展?我看到 READ-XML() 有一个选项,但该选项将其存储在临时表中。

使用 Progress Openedge 版本。 11

【问题讨论】:

    标签: xml progress-4gl openedge


    【解决方案1】:

    对于“原始”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).
    

    【讨论】:

    • 这很好用,但前提是我有远程 xml 的名称。在这种情况下,我没有并且 hxDoc:LOAD 失败。
    • 这与解析xml有关,对吧?我不完全认为我明白你想要做什么。也许你可以澄清一下?包含示例总是有帮助的!
    • 不,它无法从hXDoc:LOAD("file","http://myurl/paging$1,1", TRUE) 上的源获取 xml。如果我将此 URL 粘贴到 Web 浏览器中,我会在屏幕上获得输出 XML。现在,如果我用我的其他来源尝试你的例子,它有一个 xml 名称 - hXDoc:LOAD("file","http://myotherurl/products.xml", TRUE) 那么它可以工作。我用hXDoc:SAVE(...) 保存x-doc 并让现有的SAX 解析器接管。我认为问题在于我没有访问该远程系统上的实际文件,而是调用一个将生成的 xml 反馈回来的 Web 服务......如果这有任何意义的话。
    • 也许 http-headers 没有正确告诉 Progress 这真的是 xml?也许回到 Tim 的想法 - 围绕 curl 编写一个包装器,然后从下载的文件中加载 xml。
    • 现在摆弄 curl。但是您的示例解决了我的其他 9/10 远程 xml 问题。这并没有白费。谢谢。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • curl with --compressed flag 无故障交付(到文件)。连同来自@Jensd 的包装器指针/代码,我的问题得到了解决。很难回答标记,但是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多