如何使用 Progress 4GL 语言解析 XML 文件?

How to parse XML file using Progress 4GL language?

See original XML

我需要解析 XML 比较之前的 row.Please 看看附图

下面是我的解析进度4GL查询XML

DEFINE INPUT PARAMETER ipc_fileName AS CHARACTER.

DEFINE VARIABLE cSegmentName AS CHARACTER   NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE i661 AS INTEGER NO-UNDO.
DEFINE VARIABLE cInputData AS CHARACTER NO-UNDO.
DEFINE VARIABLE lv_c_Customer_Number AS INTEGER NO-UNDO.

INPUT FROM VALUE(ipc_FileName).
 IF cInputData = "" THEN NEXT.
    cSegmenTNAME = SUBSTRING(cInputData,1,3).     

CASE cSegmenTNAME :
        WHEN "661" THEN DO:
                 i = i + 1.
            IF LENGTH(cInputData) = 128 THEN DO:
                ASSIGN
                i661                 = i
                lv_c_Customer_Number = SUBSTRING(cInputData,6,9).
END.

同样,我可以解析每一行,但我的疑问是如果前一行以 664 开头,如何解析第 663 行。

如有任何答案,请在此表示感谢。

要解析 XML 进行中,您有多种选择。您的示例中均未使用这些。

选项:

DATASET 和 TEMP-TABLES 可以读取(格式正确)XML.

几乎任何 XML 都可以被代表 XML 的数据集读取。这对于简单的 XMLs 来说非常容易。如果 xml 与 temp-table 的表示匹配,则 Temp-tables 可以直接读取 xml。通常情况并非如此,除非 xml 确实是一个序列化的 temp-table。

将 xml 读入数据集和 temp-tables 需要对数据集和 temp-tables 以及如何格式化它们并使用 "serialize-name"、"serialize-hidden" 等等。

示例来自 https://knowledgebase.progress.com/articles/Article/How-to-read-an-XML-in-a-temp-table-using-READ-XML

DEFINE VARIABLE lcc AS LONGCHAR INIT "<A><B>Red</B><B>Green</B></A>". 

DEFINE TEMP-TABLE ttb SERIALIZE-NAME "B" 
    FIELD cc AS CHAR XML-NODE-TYPE "text". 

DEFINE DATASET dsa SERIALIZE-NAME "A" FOR ttb. 

DATASET dsa:READ-XML( "longchar", lcc, ?, ?, ? ). 

FOR EACH ttb: 
    MESSAGE ttb.cc VIEW-AS ALERT-BOX. 
END.

文档对象模型 (X-DOCUMENT)

使用 DOM 创建一个 X-DOCUMENT 对象,它可以读取 xml。然后你将有一个包含 XML 数据的树结构。你必须自己解析它,所以准备好遍历节点树...

示例(从https://knowledgebase.progress.com/articles/Article/P21055复制):

The below code reads a file called personal.xml, processes all of its child nodes and displays information if the node name is "person":

/* e-attnam.p */
DEFINE VARIABLE hDoc AS HANDLE NO-UNDO.
DEFINE VARIABLE hRoot AS HANDLE NO-UNDO.
DEFINE VARIABLE good AS LOGICAL NO-UNDO.

CREATE X-DOCUMENT hDoc.
CREATE X-NODEREF hRoot.

hDoc:LOAD("file","personal.xml",TRUE).

hDoc:GET-DOCUMENT-ELEMENT(hRoot).

RUN GetChildren(hRoot, 1).

DELETE OBJECT hDoc.
DELETE OBJECT hRoot.

PROCEDURE GetChildren:
DEFINE INPUT PARAMETER hParent AS HANDLE NO-UNDO.
DEFINE INPUT PARAMETER level AS INTEGER NO-UNDO.

DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE hNoderef AS HANDLE NO-UNDO.

CREATE X-NODEREF hNoderef.

REPEAT i = 1 TO hParent:NUM-CHILDREN:
   good = hParent:GET-CHILD(hNoderef,i).
   IF NOT good THEN
LEAVE.
   IF hNoderef:SUBTYPE <> "element" THEN
NEXT.
   IF hNoderef:NAME = "person" THEN
       MESSAGE "getattr id gives" hNoderef:GET-ATTRIBUTE("id") hNoderef:ATTRIBUTE-NAMES.
   RUN GetChildren(hNoderef, (level + 1)).
END.

DELETE OBJECT hNoderef.
END PROCEDURE.

简单 API 用于 XML (SAX)

这可能是 XML 的一种更轻量级的方法。您将必须编写代码 "reacts" XML 中某些节点的存在。

示例可在 https://knowledgebase.progress.com/articles/Article/000035469

找到

对于所有事情 XML 和进度:https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvxml%2Fpreface.html%23