Как разобрать файл XML с помощью языка Progress 4GL? - PullRequest
0 голосов
/ 31 декабря 2018

См. Оригинальный XML

Мне нужно проанализировать XML после сравнения предыдущей строки. Пожалуйста, посмотрите прикрепленное изображение

Ниже приведен мой запрос на выполнение 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.

Аналогично, я могу анализировать каждую строку, но я сомневаюсь, как проанализировать строку 663, если предыдущая строка начинается с 664.

Любые ответы приветствуются здесь.

1 Ответ

0 голосов
/ 08 января 2019

Для разбора XML в Progress у вас есть несколько вариантов.Ни один из них не используется в вашем примере.

Опции:

DATASET и TEMP-TABLES могут читать (правильно отформатированный) XML.

Почти любой XML может быть прочитан DATASET, который представляетXML.Это может быть довольно легко для простых XML.Temp-таблицы могут напрямую читать xml, если этот xml соответствует представлению temp-таблицы.Обычно это не так, если xml действительно не является сериализованной временной таблицей.

Чтение xml в наборы данных и временные таблицы требует приличных знаний о наборах данных и временных таблицах и о том, как их отформатировать и адаптировать, используя такие атрибуты, как «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):

Приведенный ниже код читает файл с именем personal.xml, обрабатывает все его дочерние узлы и отображает информацию, если имя узла «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. Вам придется написать код, который «реагирует» на присутствие определенных узлов в XML.

Пример можно найти по адресу https://knowledgebase.progress.com/articles/Article/000035469

Для всех вещей XML и Progress: https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvxml%2Fpreface.html%23

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...