【问题标题】:How to read a XML file and export an item using Progress 4GL如何使用 Progress 4GL 读取 XML 文件并导出项目
【发布时间】:2019-01-16 18:17:03
【问题描述】:

当我执行以下代码来读取正在进行的 XML 文件语言时,我只需要该 XML 文件中的 3 个项目,但此代码无法读取它。

代码是:

DEFINE VARIABLE hDoc   AS HANDLE  NO-UNDO.
DEFINE VARIABLE hRoot  AS HANDLE  NO-UNDO.
DEFINE VARIABLE hTable AS HANDLE  NO-UNDO.
DEFINE VARIABLE hField AS HANDLE  NO-UNDO.
DEFINE VARIABLE hText  AS HANDLE  NO-UNDO.
DEFINE VARIABLE hBuf   AS HANDLE  NO-UNDO.
DEFINE VARIABLE hDBFld AS HANDLE  NO-UNDO.
DEFINE VARIABLE ix     AS INTEGER NO-UNDO.
DEFINE VARIABLE jx     AS INTEGER NO-UNDO.
DEFINE VARIABLE returnCode AS DECIMAL   NO-UNDO.
DEFINE VARIABLE returnMessage AS CHARACTER   NO-UNDO.
DEFINE VARIABLE bravoId AS CHAR   NO-UNDO.

CREATE X-DOCUMENT hDoc.
CREATE X-NODEREF hRoot.
CREATE X-NODEREF hTable.
CREATE X-NODEREF hField.
CREATE X-NODEREF hText.


/* Read in the file created in i-outcus.p */
hDoc:LOAD("file", "C:\user53.xml", TRUE).
hDoc:GET-DOCUMENT-ELEMENT(hRoot).

REPEAT ix = 1 TO hRoot:NUM-CHILDREN:
  hRoot:GET-CHILD(hTable, ix).

  /* Get the fields given as attributes */

  string(returnCode)    = hTable:GET-NODE("returnCode").
  returnMessage = hTable:GET-NODE("returnMessage").
  bravoId       = hTable:GET-NODE("Id").
REPEAT jx = 1 TO hTable:NUM-CHILDREN:
    hTable:GET-CHILD(hField, jx).                              
    hField:GET-CHILD(hText, 1).
 hDBFld:BUFFER-VALUE = hTEXT:NODE-VALUE.
  END.
END.

DELETE OBJECT hDoc.
DELETE OBJECT hRoot.
DELETE OBJECT hTable.
DELETE OBJECT hField.
DELETE OBJECT hText.

FOR EACH v:
  DISPLAY ' ReturnCode: ' + STRING(returnCode) + ' - ReturnMessage: ' + returnMessage + ' id: ' + id.
END.

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <ns1:ImportProfilesResponse xmlns:ns1="http://host.bs.com/common/webservice/ProfileManagement/">
      <returnCode>-996</returnCode>
      <returnMessage>Invalid SOAP Request Object - 112(FISCAL_CODE);</returnMessage>
      <id>0000</id>
    </ns1:ImportProfilesResponse>
  </soapenv:Body>
</soapenv:Envelope>

【问题讨论】:

    标签: xml openedge progress-4gl


    【解决方案1】:

    有不同的方法可以做到这一点。也许您可以使用临时表定义一个数据集,然后简单地将数据读入其中。

    保留部分解决方案,这就是我最终的结果。它也可以递归地完成(遍历 xml)。

    基本上你需要做的是遍历xml,当你点击正确的节点时,你会再降一级等等。你还需要了解节点的值实际上就是一个节点本身。

    DEFINE VARIABLE hDoc   AS HANDLE  NO-UNDO.
    DEFINE VARIABLE hRoot  AS HANDLE  NO-UNDO.
    DEFINE VARIABLE hTable AS HANDLE  NO-UNDO.
    DEFINE VARIABLE hField AS HANDLE  NO-UNDO.
    DEFINE VARIABLE hText  AS HANDLE  NO-UNDO.
    DEFINE VARIABLE hValue AS HANDLE NO-UNDO.
    DEFINE VARIABLE ix     AS INTEGER NO-UNDO.
    DEFINE VARIABLE jx     AS INTEGER NO-UNDO.
    DEFINE VARIABLE kx     AS INTEGER NO-UNDO.
    
    DEFINE VARIABLE returnCode    AS DECIMAL    NO-UNDO.
    DEFINE VARIABLE returnMessage AS CHARACTER  NO-UNDO.
    DEFINE VARIABLE bravoId       AS CHAR       NO-UNDO.
    
    CREATE X-DOCUMENT hDoc.
    CREATE X-NODEREF hRoot.
    CREATE X-NODEREF hTable.
    CREATE X-NODEREF hField.
    CREATE X-NODEREF hText.
    CREATE X-NODEREF hValue.
    
    /* Read in the file created in i-outcus.p */
    hDoc:LOAD("file", "C:\temp\user53.xml", FALSE).
    hDoc:GET-DOCUMENT-ELEMENT(hRoot).
    
    REPEAT ix = 1 TO hRoot:NUM-CHILDREN:
        hRoot:GET-CHILD(hTable, ix).
    
        IF hTable:NAME = "soapEnv:body" THEN DO:
    
            REPEAT jx = 1 TO hTable:NUM-CHILDREN:
                hTable:GET-CHILD(hField, jx).
    
                IF hField:NAME = "ns1:ImportProfilesResponse" THEN DO:
                    REPEAT kx = 1 TO hFIeld:NUM-CHILDREN:
                        hField:GET-CHILD(hText, kx).
    
                        IF hText:NUM-CHILDREN = 1 THEN DO:
                            hText:GET-CHILD(hValue, 1).
    
                            IF hText:NAME = "returnCode" THEN DO:
                                returnCode = DECIMAL(hValue:NODE-VALUE) NO-ERROR.        
                            END.
                            ELSE IF hText:NAME = "returnMessage" THEN DO:
                                returnMessage = hValue:NODE-VALUE. 
                            END.
                            ELSE IF hText:NAME = "id" THEN DO:
                                bravoId = hValue:NODE-VALUE.
                            END. 
                        END.
                    END.    
                END.
            END.
        END.
    END.
    
    DELETE OBJECT hDoc.
    DELETE OBJECT hRoot.
    DELETE OBJECT hTable.
    DELETE OBJECT hField.
    DELETE OBJECT hText.
    DELETE OBJECT hValue.
    
    
      MESSAGE ' ReturnCode: ' STRING(returnCode) SKIP 
              ' ReturnMessage: ' returnMessage  SKIP
              ' Id: ' bravoId VIEW-AS ALERT-BOX .
    

    【讨论】:

    • 感谢您的感谢,但我更感谢您的支持!
    【解决方案2】:

    对于读取和处理 XML 的几个片段,我认为使用 SAX 阅读器会更好。

    这个Progress Sax-reader 有一些关于如何实现它的想法。

    根据我的经验,SAX 阅读器比完整的 XML 文档更容易使用。

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 2014-08-20
      • 2021-07-22
      • 2018-02-26
      • 1970-01-01
      • 2018-06-04
      • 2016-01-17
      • 2014-08-27
      相关资源
      最近更新 更多