如何使用 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" 等等。
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
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" 等等。
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