Запись описания набора данных в XML
Для обмена данными в форме XML-документов отправляющая и принимающая стороны должны согласовать формат XML-документа. Этот формат называется схемой XML. Схема описывает, как интерпретировать данные (элементы и атрибуты) XML-документа. Как правило, отправляющая сторона создаёт и отправляет её принимающей стороне.
Приложения OpenEdge имеют два метода публикации XML-схемы. Методы WRITE-XML и WRITE-XMLSCHEMA могут преобразовывать определения временной таблицы и ProDataSet в схему XML.
Мы будем использовать запись XML-схемы в файл. Однако существует несколько других доступных опций, которые описаны в документации для метода WRITE-XMLSCHEMA, и которые не будут здесь описаны.
Существует два варианта расположения и записи схемы XML:
- Вместе с XML-данными, когда вы вставляете XML-схему в начало файла с XML-данными.
- В отдельном файле схемы XML, когда вы отправляете один файл со схемой XML, и отдельный файл, содержащий данные.
Выбор расположения схемы зависит от бизнес-требований, частоты обмена данными и частоты изменений схемы.
Если вы часто обмениваетесь данными с другим бизнесом, а схема остаётся неизменной большую часть времени, то отдельный файл схемы XML может улучшить производительность. После первоначальной загрузки другому бизнесу требуется только загрузить информацию о схеме, если она изменяется. После того, как схема известна, вы можете отправлять данные так часто, как необходимо, не указывая схему снова. Например, компания X получает заказы по каталогу от своих клиентов. Схема XML для заказов каталога хорошо известна и стабилизирована, а любые заказы, которые не соответствуют схеме, отклоняются.
Если обмен данными происходит нечасто и/или схема может измениться, то может быть проще каждый раз отправлять XML-схему вместе с данными. Например, компания X будет принимать специальные заказы, но эти специальные заказы содержат информацию, которая не соответствует обычному заказу. Чтобы правильно передать специальный заказ, клиенты должны включить соответствующую XML-схему в каждый специальный заказ.
Запись схемы XML в отдельный файл
Для создания отдельного файла, который будет содержать только схему XML, используется метод WRITE-XMLSCHEMA с указанием имени файл и параметра FILE.
После того, как схема сохранена в отдельный файл, её можно использовать двумя способами:
- Отправить схему отдельно от данных.
- Сослаться на файл схемы при отправке данных в XML-файле.
В качестве расширения файла, которое используется для файлов схемы XML, как правило используется .xsd, которое расшифровывается как XML Schema Definitions.
Синтаксис записи схемы XML в отдельный файл:
lReturn = HANDLE:WRITE-XMLSCHEMA (target-type, target-name [,formatted[,encoding[,min-xmlSchema[,omit-initial-values]]]]).
Приведённый ниже пример кода указывает внешний файл в качестве расположения XML-схемы для набора данных Order/OrderLine:
ASSIGN ctargetType = "FILE" cfile = "dsOrderOrderLine.xsd" lformatted = "TRUE". DATASET dsOrderOrderLine:WRITE-XMLSCHEMA (ctargetType, cfile, TRUE).
Примечание: в этом примере не использованы некоторое необязательные параметры.
В результате работы этого примера в файл dsOrderOrderLine.xsd будет записано следующее содержимое:
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:prodata="urn:schemas-progress-com:xml-prodata:0001"> <xsd:element name="dsOrderOrderLine" prodata:proDataSet="true"> <xsd:complexType> <xsd:sequence> <xsd:element name="ttOrder" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="OrderNum" type="xsd:int" nillable="true" prodata:format="zzzzzzzzz9"/> <xsd:element name="OrderDate" type="xsd:date" nillable="true"/> <xsd:element name="ShipDate" type="xsd:date" nillable="true"/> <xsd:element name="PromiseDate" type="xsd:date" nillable="true"/> <xsd:element name="OrderTotal" type="xsd:decimal" nillable="true" prodata:format="->,>>>,>>9.99" prodata:decimals="0"/> <xsd:element name="ttOrderLine" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="LineNum" type="xsd:int" nillable="true" prodata:format=">>9"/> <xsd:element name="ItemNum" type="xsd:int" nillable="true" prodata:format="zzzzzzzzz9"/> <xsd:element name="Price" type="xsd:decimal" nillable="true" prodata:format="->,>>>,>>9.99" prodata:decimals="0"/> <xsd:element name="Qty" type="xsd:int" nillable="true" prodata:format="->>>>9"/> <xsd:element name="Discount" type="xsd:int" nillable="true" prodata:format=">>9%"/> <xsd:element name="ExtendedPrice" type="xsd:decimal" nillable="true" prodata:format="->>>,>>9.99" prodata:decimals="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> ... ... ... ... ... ... ... ... ... </xsd:element> </xsd:schema>
Примечание: в этом пособии не описывается назначение элементов схемы и как создавать схему XML вручную. Выше приведён только пример того, как AVM её генерирует. Для изучения XML обратитесь к специализированной литературе.
Ссылка на файл схемы XML в методе WRITE-XML
После создания файла со схемой XML с помощью метода WRITE-XMLSCHEMA его можно отправить отдельно или сослаться на него в документе XML с помощью метода WRITE-XML и параметра schema-location. Как правило, если вы делитесь документами, то схема XML размещается на веб-сервере, а параметр schema-location содержит URL.
lReturn = hdsOrder:WRITE-XML (cTargetType, cTargetName, lFormatted, cEncoding, cSchemaLocation, lWriteXMLSchema, lMinSchema, lWriteBeforeImage, lOmitInitialValues).
Пример:
lReturn = hdsOrder:WRITE-XML (“FILE”, “myFile.xml”, TRUE, ?, “http://xmltest/schema/mySchema.xsd”).
Улучшение производительности
Определения XML-схем могут стать довольно большими. Чтобы минимизировать размер определения схемы XML, можно исключить информацию, специфичную для ABL. Среди этих специфичных для ABL расширений XML-схемы есть такие вещи, как:
- Форматирование меток и строк справки, специфичных для полей временной таблицы.
- Не уникальные индексы.
- Статус UNDO временной таблицы.
- Чувствительность к регистру.
Метод WRITE-XMLSCHEMA использует необязательный параметр min-xmlschema, который управляет включением специфичной для ABL информации. Этот параметр по умолчанию имеет значение FALSE, что означает, что специфичная для ABL информация включена.
Если предполагаемый получатель не является приложением OpenEdge, то min-xmlschema рекомендуется установить в TRUE.
Если предполагаемым получателем является другое приложение OpenEdge, то расширения схемы XML имеют значение. В этом случае параметр min-xmlschema должен иметь значение FALSE (значение по умолчанию).
Запись схемы XML с данными XML
Альтернативой записи схемы XML в отдельный файл является её запись вместе с данными в файл XML. Этот подход можно использовать, если вы обмениваетесь данными нечасто или если схема часто меняется.
Чтобы записать схему с XML-данными, используйте метод WRITE-XML со значением параметра write-xmlschema равным TRUE.
lReturn = hdsOrder:WRITE-XML (cTargetType, cTargetName, lFormatted, cEncoding, cSchemaLocation, lWriteXMLSchema, lMinSchema, lWriteBeforeImage, lOmitInitialValues).
Пример:
lReturn = hdsOrder:WRITE-XML (“FILE”, “myFile.xml”, TRUE, ?, ?, TRUE).
В следующей таблице приведены параметры, используемые для записи XML-схемы.
Для записи схемы XML |
Используемый параметр |
Примечание |
Вместе с данными | write-xmlschema | Значение по умолчанию FALSE, схема не записывается вместе с данными. |
В виде ссылки на файл схемы XML | schema-location | Необходимо указать расположение файла со схемой XML |
Эти два параметра являются взаимоисключающими. Либо схема является встроенной, либо вы используете расположение схемы для ссылки на внешний файл. Вы получите ошибку времени выполнения, если будут указаны оба параметра.