Заполнение ProDataSet из файла XML
Взаимодействие с внешними приложениями и источниками данных, как правило, происходит в двух направлениях:
- Запись содержимого ProDataSet и схемы в формате XML и отправку результата получателю для чтения.
- Получение от сторонних приложений, чтение и сохранение данных XML и схемы в ProDataSet.
В этой части мы рассмотрим, как происходит чтение XML и сохранение в наборах данных OpenEdge.
Перед тем как загрузить данных из XML-файла во временную таблицу или ProDataSet, вам сначала необходимо описать набор данных со структурой, соответствующей структуре данных XML.
В OpenEdge существуют инструменты, которые помогут на основе схемы XML создать описание ProDataSet.
Инструмент |
Назначение |
Утилита xsdto4gl | Создаёт включаемый файл из схемы XML, который включает описание статичных временных таблиц и набора данных, соответствующих структуре данных XML. |
Метод READ-XMLSCHEMA | Читает схему их документа со схемой XML. Может создавать динамический ProDataSet, если метод был применён с дескриптором ProDataSet в режиме CLEAR. Если ProDataSet определён статично, то метод выполняет проверку схемы временных таблиц и ProDataSet. |
Метод READ-XML | Читает схему XML и данные за раз.
Может создавать динамический ProDataSet, если метод был применён с дескриптором ProDataSet в режиме CLEAR. Данные загружается в созданный ProDataSet. |
Создание описания ProDataSet на основе схемы XML
Если обе стороны заранее договорились о схеме, то вам не нужно отправлять схему каждый раз, когда отправляются данные. Например, предположим, что вы регулярно обмениваетесь XML-данными с поставщиком. Вы и поставщик договорились, что структура XML-данных будет одинаковой каждый раз. Схема XML не изменяется или изменяется нечасто.
В этом случае можно заранее получить XML-схему и определить статический ProDataSet, соответствующий ей. После того, как ProDataSet определен таким образом, вы можете повторно использовать его каждый раз, когда получаете XML-данные от этого поставщика, потому что нет необходимости читать схему каждый раз.
Этот подход эффективен, так как информация схемы не должна передаваться каждый раз при отправке данных. Кроме того, если схема очень большая, то заранее подготовленное определение схемы экономит время и ресурсы.
Если OpenEdge является принимающей стороной, отправляющая сторона сообщит вам местоположение схемы XML. В большинстве случаев схема определяется в отдельном XML-файле. Однако для удобства OpenEdge также имеет возможность считывать схему и данные из одного файла.
Генерация статичных временных таблицы и ProDataSet
Для генерации статичных наборов данных из файла со схемой XML применяется утилита командной строки xsdto4gl, которая по умолчанию генерирует включаемый файл (.i) содержащих описание ProDataSet. Имя включаемого файла по умолчанию состоит из имени файла .xsd и расширения “.i”.
Рассмотрите возможность использования утилиты, когда:
- Вы договорились с отправляющей стороной о структуре данных.
- Вы будете читать XML-данные много раз из XML-файлов с одинаковой структурой (XML-схема).
Для того чтобы xsdto4gl могла создавать описание временной таблицы ABL или ProDataSet, необходимо следующее:
- Входной файл должен быть файлом схемы XML (.xsd-файл).
- Схема XML должна содержать структуру, которая может быть сопоставлена с временной таблицей или ProDataSet.
Второй пункт очень важен, так как не каждая схема XML может быть сопоставлена с временными таблицами или наборами данных ABL.
Синтаксис
xsdto4gl – это имя исполняемого файла. В то время как bproxsdto4gl – это скрипт, который устанавливает среду окружения OpenEdge (DLC) и затем исполняет xsdto4gl.
bproxsdto4gl [-h] | { xml-schema-filename [ -output { output-directory-name | filename } ] [ -element element-name ] [ -overridemapping ] [ -fieldtypemapping { field-mapping-file } ]
Далее показана простая иллюстрация того, как xsdto4gl работает для XML-схемы, представляющей временную таблицу Cust. Инструмент создаёт файл cust.i из файла cust.xsd.
proenv>type cust.xsd <?xml version=”1.0” encoding=”utf-8”?> <xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns=””> <xsd:element name=”Cust” prodata:proTempTable=”true” prodata:undo=”true”> <xsd:complexType> <xsd:sequence> <xsd:element name=”CustRow” minOccurs=”0” maxOccurs=”unbounded”> <xsd:complesType> <xsd:sequence> <xsd:element name=”CustomerNumber” type=”xsd:int” nillable=”true” prodata:format=”>>>>9” prodata:label=”Cust Num” prodata:help=”Entera cust number.”/> <xsd:element name=”Name” type=”xsd:string” nillable=”true” prodata:format=”x(30)” prodata:help=”Please enter a name.”/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:secuence> </xsd:complexType> </xsd:element> </xsd:schema> proenv>xsdto4gl cust.xsd proenv>type cust.i DEFINE TEMP-TABLE Cust NO-UNDO FIELD CustomerNumber AS INTEGER FORMAT “>>>>9” LABEL “Cust Num” HELP “Enter a cust number” FIELD Name AS CHARACTER FORMAT “x(30)” HELP “Please enter a name.”.
Чтение описания схемы XML
Оба метода READ-XML и READ-XMLSCHEMA могут преобразовывать XML-схему в динамические описания временных таблиц и ProDataSet. Если отправляющая сторона предоставляет отдельный файл схемы XML, то можно использовать любой из этих методов. Если отправляющая сторона предоставляет схему вместе с данными, то необходимо использовать метод READ-XML.
Полный синтаксис метода READ-XMLSCHEMA:
READ-XMLSCHEMA (source-type, source-name, override-default-mapping [, field-type-mapping [, verify-schema-mode )]]).
Первые два параметра, source-type и source-name, описаны в разделе в этой секции. Следующие два параметра связаны с сопоставлением типов данных XML-схемы с типами данных OpenEdge. Эти параметры рассматриваются в секции “Настройка сопоставления типов данных” данного урока. Последний параметр, verify-schema-mode, обсуждается в разделе “Проверка XML-схемы” данного урока.
Обязательны первые три параметра. Остальные необязательны.
Следующий вызов метода считывает XML-схему из .xsd-файл “supplier1”:
lReturn = hds:READ-XMLSCHEMA (“FREE”, “supplier1.xsd”,?).
Имя файла может быть указано с полным путём, относительным путём или в виде URL.
lReturn = hds:READ-XMLSCHEMA (“FREE”, “wrk\supplier1.xsd”,?).
Если используется URL, то протокол должен быть FILE или HTTP (не HTTPS).
В качестве альтернативны метода READ-XMLSCHEMA может использоваться метод READ-XML с указанием параметра schema-location для определения расположения файла со схемой XML.
Синтаксис метода READ-XML:
READ-XML (source-type, source-name, read-mode, schema-location, override-default-mapping [, field-type-mapping [, verify-schema-mode]])
Метод READ-XML поддерживает все типы источников (source-type), которые поддерживает метод WRITE-XML, за исключением типа STREAM. В этом пособии мы используем тип источника FILE, поэтому параметры source-name может содержать имя и путь (или URL) к файлу XML
Для получения дополнительной информации о типах источников обратитесь к документации по OpenEdge.
Для указания расположения файла схемы в методе READ-XML используется параметр schema-location. Допустимыми значениями этого параметра являются:
- Значение по умолчанию в виде неизвестного значения. Это означает, что вы не используете внешний файл схемы XML.
- Имя файла или URL, указывающие на расположение файла со схемой XML.
Пример вызова метода READ-XML:
lReturn = hds:READ-XML (“FILE”, “incommingdata.xml”, REPLACE, “incommingSchema.xsd”, FALSE).
Таблица с описанием элементов примера:
Синтаксис элемента |
Значение в примере |
Назначение |
source-type | FILE | Источник FILE, так как XML-файл загружается из файла. |
source-name | Incommingdata.xml | Название файла с XML-документом. |
read-mode | REPLACE | Замена существующих данных новыми значениями, считанными из XML-файла. |
schema-location | incommingSchema.xsd | Чтение схемы из указанного файла. |
override-default-mapping | FALSE | Используется сопоставление по умолчанию между XML-схемой и типами данных OpenEdge. |