当我执行以下代码来读取进度语言的XML文件时,我只需要该XML文件中的3个项目,但此代码无法读取它。
代码是:
DEFINE VARIABLE hDoc AS HANDLE NO -…
有不同的方法来做到这一点。也许你可以用temp-tables定义一个数据集,然后简单地将数据读入。
保留解决方案的一部分就是我最终的目标。它也可以递归地完成(走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 .
为了阅读和处理XML的一些片段,我认为使用SAX阅读器会更好。
这个 Progress Sax-reader 对如何实现这一点有一些想法。
根据我的经验,SAX阅读器比完整的XML文档更容易使用。