Запись данных ProDataSet в XML
Данные из временных таблиц и наборов данных могут быть записаны в документ XML с помощью ABL-метода WRITE-XML. Кроме того, с помощью метода WRITE-XML вы можете записать и схему. Однако пока мы предполагаем, что отправляющая и принимающая стороны ранее согласовали и обменялись схемой. Поэтому о записи XML-схемы вы узнаете позже.
Использование XML-функций в ABL обеспечивает взаимодействие между OpenEdge и сторонними продуктами для обмена данными в общем формате. Этот урок фокусируется именно на этом сценарии использования.
XML также может использоваться для обеспечения постоянного механизма хранения для ProDataSet и временных таблиц между вызовами сессий ABL.
Синтаксис для записи временной таблицы или набора данных в файл XML:
lReturn = HANDLE:WRITE-XML(target-type, target-name [,formatted[,encoding[,schema-location[,write-xmlschema[,min-xmlschema[,write-before-image[,omit-initial-values]]]]]]]).
Мы начнём с использования двух обязательных параметров (target-type и target-name) и первого необязательного параметра (formatted). Остальные параметры будут рассмотрены позже.
В таблице ниже описывается, как пример кода сопоставляется с элементами синтаксиса.
lReturn = hdsorder:WRITE-XML("FILE","dsorder.xml",TRUE).
|
Параметр |
Назначение |
| lReturn | Логическая переменная для хранения результата вызова метода. |
| hdsorder | Дескриптор набора данных. |
| “FILE” | Тип вывода, в этом примере выполняется вывод в файл. Существуют другие типы. |
| “dsorder.xml” | Имя файла для записи. |
| TRUE | Форматирование XML с добавлением пробелов и прочих символов форматирования для удобства чтения содержимого файла. По умолчанию используется FALSE для записи содержимого в одной длинной строке. |
В наших примерах в качестве значения параметра target-type мы будем использовать FILE. Запись в файл обычно полезна на стадии тестирования, однако в производственной среде если вы хотите сократить нагрузку на дисковый ввод-вывод, то вы можете использовать типы вывода LONGCHAR или MEMPTR. Это позволит выполнять все XML-операции в памяти.
Практика кодирования
Чтобы упростить использование параметров, можно присвоить значения переменным, представляющим каждый параметр, и использовать их при вызове метода. В приведённом ниже примере первым трём переменным присваиваются значения, а остальные остаются со значениями по умолчанию.
ASSIGN cTargetType = "file" cTargetName = "dsorder.xml" lFormatted = TRUE cEncoding = ? cSchemaLocation = ? lWriteXMLSchema = ? lMinSchema = ? lWriteBeforeImage = ? lOmitInitialValues = ?.
Следующий метод WRITE-XML использует назначенные выше значения параметров:
lReturn = hdsOrder:WRITE-XML (cTargetType, cTargetName, lFormatted, cEncoding, cSchemaLocation, lWriteXMLSchema, lMinSchema, lWriteBeforeImage, lOmitInitialValues).
В следующем коде определяется и заполняется набора данных, а сразу после заполнения ProDataSet с помощью метода WRITE-XML выполняется запись данных в документ XML.
DEFINE VARIABLE iOrderNum AS INTEGER NO-UNDO.
DEFINE VARIABLE hdsOrderOrderLine AS HANDLE NO-UNDO.
DEFINE VARIABLE lReturn AS LOGICAL NO-UNDO.
/* TEMP-TABLE/Dataset/Data-source and parameters definitions */
{ttDefs.i}
{dsDefs.i}
{srcDefs.i}
{paramVarDefs.i}
/*Get input value of order number */
UPDATE iOrderNum WITH FRAME OrderFrame TITLE "Order Lookup".
/*Define handle to pds */
hdsOrderOrderLine = DATASET dsOrderOrderLine:HANDLE.
/*Populate the ProDataSet */
RUN order_server_getdata.p (INPUT iOrderNum, OUTPUT DATASET dsOrderOrderLIne).
/*Write the XML data into file*/
ASSIGN
cTargetType = "FILE"
cTargetName = "dsorderorderline.xml"
lFormatted = TRUE
cEncoding = ?
cSchemaLocation = ?
lWriteXMLSchema = ?
lMinSchema = ?
lWriteBeforeImage = ?
lOmitInitialValues = ?.
lReturn = hdsOrderOrderLine:WRITE-XML (cTargetType,
cTargetName,
lFormatted,
cEncoding,
cSchemaLocation,
lWriteXMLSchema,
lMinSchema,
lWriteBeforeImage,
lOmitInitialValues).
MESSAGE "XML file has been written."
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
Следующий пример показывает результат работы предыдущего кода (содержимое файла dsorderorderline.xml).
<dsOrderOrderLine xmlns:xsi=:http://www.w3.org/2001/XMLSchema-instance"> <ttOrder> <OrderNum>21</OrderNum> <OrderDate>1998-02-08</OrderDate> <SchipDate>1998-02-13</SchipDate> <PromiseDate>1998-02-13</PromiseDate> <OrderTotal>688.37</OrderTotal> <ttOrderLine> <OrderNum>21</OrderNum> <LineNum>1</LineNum> <ItemNum>43</ItemNum> <Price>13.97</Price> <Qty>38</Qty> <Discount>10</Discount> <ExtendedPrice>477.77</ExtendedPrice> </ttOrderLine> <ttOrderLine> <OrderNum>21</OrderNum> <LineNum>2</LineNum> <ItemNum>9</ItemNum> <Price>18.0</Price> <Qty>13</Qty> <Discount>10</Discount> <ExtendedPrice>210.6</ExtendedPrice> </ttOrderLine> </ttOrder>
