Для разбора 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