Запись данных 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>