Juri Shutenko Personal Homepage. Visual FoxPro.

XML. Часть 4. Использование функции CURSORTOXML. (новая редакция)

Надеюсь, что первое представление о XML вы получили. Простейший путь создания документа XML в Visual FoxPro заключается в использовании его функции CursorToXML(). Давайте рассмотрим ее подробно. Что говорит нам по ее поводу руководству по языку? Мои дополнения выделены синим цветом.

Функция конвертирует таблицу или курсор Visual FoxPro в XML-документ.
Синтаксис функции:

CURSORTOXML(nWorkArea | cTableAlias, cOutput [, nOutputFormat 
[, nFlags [, nRecords [, cSchemaName [, cSchemaLocation [, cNameSpace ]]]]]])

не претерпел никаких изменений с выходом VFP 9.0,

Параметры:
 
В качестве первого параметра могут быть использованы либо номер рабочей области, в которой открыта таблица или курсор, данные из которых вы желаете экспортировать в XML, либо их псевдоимя - Alias.
 
nWorkArea
Указывает рабочую область таблицы, из которой будет создаваться XML строка. Если вы укажите 0 или вообще ничего не укажите, Visual FoxPro будет использовать текущую рабочую область.
 
cTableAlias
Указывает псевдоимя (alias) таблицы, из которой будет создаваться XML строка. .
 
cOutput
Указывает путь и имя файла или переменную памяти, в которые будет направлен результат преобразования.
 
Если nFlags установлен в 0 (по-умолчанию), то полученный в результате преобразования XML направляется в переменную памяти. Если переменная памяти не существует, то она будет создана.
 
Если nFlags установлен в 512, то полученный в результате преобразования XML направляется в файл, и, в случае, если файла не существует, то он он будет создан, в противном случае он будет переписан. Но при этом учитывается установка SET SAFETY.
 
nOutputFormat
Определяет выходной формат XML строки. В приведенной ниже таблице перечислены возможные значения для nOutputFormat.

nOuputFormatОписание
1 – ELEMENTS(по-умолчанию) Element-centric XML. Cодержание файла, экспортированного с этим значением параметра представлено здесь.
2 – ATTRIBUTESAttribute-centric XML. Cодержание файла, экспортированного с этим значением параметра представлено здесь.
3 – RAWОбщий (Generic), attribute-centric XML. Cодержание файла, экспортированного с этим значением параметра представлено здесь.

nFlags
Определяет форматирование XML, который получается в результате преобразования, а также направление вывода. В приведенной ниже таблице перечислены возможные значения для параметра nFlags. Значение этого параметра формируется, как сумма требуемых значений.

nFlags Bit Описание формата вывода
0 0000 (по-умолчанию) Производит XML в формате UTF-8.
 
Эта установка создает переменную памяти, указанную в cOutput, если таковая еще не существует, и направляет в нее полученную в результате преобразования XML строку.
 
Строка декларации XML не содержит аттрибута "Encoding="; вследствие этого аттрибут не устанавливается в UTF-8.
1 0001 Производит неформатированный XML как одну длинную строку.
2 0010 Заключает пустые элементы в открывающий и закрывающий тэги, например, <cc04><cc04/>.
4 0100 Сохраняет "белое" пространство в полях.
8 1000 Осуществляет перенос слов в содержимом Memo полей в секциях CDATA.
16 10000 Кодировка вывода. Кодировка вывода устанавливается по кодовой странице преобразуемого курсора.
 
Важно! Для обеспечения аккуратной трансляции, кодовая страница Visual FoxPro используемая по умолчанию, должна совпадать с кодовой страницей курсора. Вы можете обеспечить это путем установки символьных и мемо полей в курсоре в тип, предотвращающий трансляцию кодовой страницы то есть в NOCPTRAN (character binary/memo binary).
 
При установке этого значения с таблицами, имеющими любые кодовые страницы, аттриюут кодировке в XML устанавливается в пустую строку (""). Для изменения в корректный аттрибут кодировки используйте функцию STRTRAN( ).
 
Например, для кодовой страницы 936, выполните следующую команду для результирующей XML строки:
strxml=STRTRAN(strxml, 'encoding=""', 'encoding="gb2312"'
32 100000 Кодировка вывода.
512 1000000000 Вывод будет направлен в файл, указанный в качестве параметра cOutput.
 
Если файл не существуеьт, то он будет создан. Если же файл существует, то он будет переписан, при этом будет учитываться установка SET SAFETY (то есть будет выведено предупреждающее сообщение или нет).
4096 1000000000000 Запрещается перекодировка по базе base64.
 
CURSORTOXML() эспортирует в XML Memo (Binary) поля, как xsd:base64binary, в случае если вы не используете это значение флага. В Visual FoxPro, base64 кодировка является средством для кодировки только бинарных данных.
32768 нет (Начиная с VFP версии 9.0) Указывает, что должна быть использована кодовая страница.

Приведенная ниже таблица описывает - как прописывается аттрибут кодировки, когда вывод кодируется по умолчанию по кодовой странице курсора или таблицы.

Замечание
Флаги кодировки устанавливаются путем объединения бит 4 и 5 (0010000).

Encoding flagБиты 4 и 5Описание
+000(по-умолчанию) Windows-1252.
+1601Устанавливает аттрибут кодировки вывода по кодовой странице курсора.
+3210Устанавливает аттрибут кодировки вывода в UTF-8 без производства трансляции символов.
+4811Устанавливает аттрибут кодировки вывода в UTF-8 и производит трансляцию символов в UTF-8.

В приведенной ниже таблице перечислены общие Windows-совместимые кодовые страницы.

Кодовая страницаПлатформаАттрибут кодировки в декларации XMLКомментарии
437MS-DOS,USibm437 
850MS-DOS, Internationalibm850 
865MS-DOS, NordicEmpty string ("") 
866MS-DOS, Russiancp866 
932Windows, Japaneseshift-jis 
936Simplified Chinesegb2312 
949Windows, Koreaniso-2022-kr или: ks_c_5601-1987 
950Windows, Traditional Chinese (Taiwan)big5 
1250Windows, East EuropeanWindows-1250Отметьте что учитывается регистр.
1251Windows, RussianWindows-1251Отметьте что учитывается регистр.
1252Windows, U.S., West EuropeanWindows-1252Отметьте что учитывается регистр.
1253Windows, GreekWindows-1253Отметьте что учитывается регистр.
1254Windows, TurkishWindows-1254Отметьте что учитывается регистр.
1255Windows, HebrewWindows-1255Отметьте что учитывается регистр.
1256Windows, ArabicWindows-1256Отметьте что учитывается регистр.

Замечание
Visual FoxPro использует кодировку Windows-1252, как кодировку по умолчанию. Вы можете указать, что аттрибут кодировки установлен для соответствия кодовой страницы, такой как Big5 (кодовая страница 950), когда используются двух-байтные наборы символов (DBCS) для DBCS-языков, кодовые страницы которых поддерживает Visual FoxPro.

При использовании Windows-1252 и DBCS, не требуется дополнительной трансляции символов для корректного отображения вывода в Internet Explorer.

Однако, для получения XML, более согласуемого с Web browsers, которые могут интрепретировать UTF-8, вы можете дополнительно установить аттрибут кодировки в UTF-8 вместо использования Windows-1252. Выходной набор подвергается трансляции в UTF-8 символы только в том случае, если вы установили флаг nFlags в значение 48 (определить аттрибут кодировки как UTF-8 и транслировать символы в формат UTF-8). Это требуется только когда данные в действительности содержат двух-байтные символы. Вам не нужно использовать трансляцию символов, например, STRCONV(), если в выводе содержаться только символы латинского алфавита (однобайтовые символы).

nRecords
Определяет число записей, направляемых в вывод XML и его значение по умолчанию равно 0.

Если nRecords равно 0, в вывод направляются все записи таблицы или курсора. Если nRecords указано большим, чем число имеющихся в таблице/курсоре записей, то в вывод будут направлены только имеющиеся в таблице/курсоре записи, то есть не будут сгенерированы пустые строки.

cSchemaName
Указывает имя и местонахождение, содержащие информацию о схеме, используесой для данных в cOutput, например, "MySchema.xsd". Если в параметре не указано расширение, то создается файл схемы и по-умолчанию ему присваивается расширение ".xsd".

В приведенной ниже таблице перечислены возможные значения для параметра cSchemaName.

cSchemaNameОписание
cSchemaName Определяет имя и путь внешнего файла для схемы (в границах - scoped к корневому элементы XML).
 
Замечание
Если cSchemaName содержит имя файла и cSchemaLocation не предоставлена вами или оставлена пустой, содержание cSchemaName записывается в аттрибут xsi:schemaLocation или xsi:noNamespaceSchemaLocation полученного в результате преобразования XML.
 
В приведенном ниже примере, Visual FoxPro генерирует XML файл общего вида, именованный как MyXMLFile.xml иди файла Labels.dbf в псевдоимя "Labels" и файл схемы, именованный как MySchema в том же самом каталоге.
CURSORTOXML("LABELS", "myXMLFile.xml", 1, 512, 0, "mySchema.xsd")
Если cSchemaName включает в себя URI, схема прописывается в текущем каталоге и должна быть перегружена на сервер, для того чтобы быть доступной browser'у или parser'у. Внешняя схема всегда записывается в тот же каталог, или в тоже место, куда записывается XML-файл.
"1"Указывает, что будет произведена внутренняя схема. Например, приведенный ниже код производит внутреннюю схему, то есть схему, размещаемую в самом XML-файле:
CURSORTOXML("LABELS", "myXMLFile.xml", 1, 512, 0, "1")
"" Указывает, что схема не будет произведена при преобразовании данных таблицы или курсора в XML.

cSchemaLocation
Указывает дополнительное размещение, которое читающее XML приложение должно происматривать в поиске файла схемы.

Замечание
Используйте этот параметр, только когда вы размещаете вашу схему в месте, отличном от того, в котором вы размещаете XML.

Содержание параметра cSchemaLocation прописывается в аттрибут xsi:schemaLocation или xsi:noNamespaceSchemaLocation получаемого в результате преобразования данных таблицы/курсора XML. Параметр cSchemaLocation может быть адресом HTTP или прочим URI. Вам необходимо скопировать файл схемы в место, указанное в cSchemaLocation.

Приведенный ниже пример производит XML:

CURSORTOXML("LABELS", "myXMLFile.xml", 1, 512, 0, ;
       "mySchema.xsd", "http://www.microsoft.com/mySchema.xsd")

содержащий приведенный ниже аттрибут:

xsi:noNamespaceSchemaLocation=" http://www.microsoft.com/mySchema.xsd"

Указание значения cSchemaLocation в случае, когда cSchemaName оставлена пустой будет иметь следствием, что такой же аттрибут будет записан XML. Это дает вам возможность указать существующую схемы без необходимо пересоздания схемы каждый раз, когда вы вызываете CURSORTOXML( ).

cNamespace
Указывает простанство имен производимых XML или schema и в качестве значения по-умолчанию использует пустую строку ("").

Указание значения для cNameSpace устанавливает аттрибут targetNamespace в то же самое значение и добавляет в схему аттрибут elementFormDefault="qualified".

Если вы не укажите значения для cNamespace, а схема является внешей, то в схему не записывается декларация о пространстве имен. Если вы не укажите значения для cNamespace, а схема является внутренней, то значение аттрибута targetNamespace в схеме устанавливается в пустую строку ("").

Возвращаемое значение
Целочисленный тип данных. CURSORTOXML( ) возвращает число байт, записанный в файл или переменную памяти.

Примечания
(VFP 9.0) Вы можете использовать CURSORTOXML( ) c OLE DB Provider для Visual FoxPro. Однако, свойство _VFP VFPXMLProgID не поддерживается вследствие того, что системная переменная _VFP не поддерживается в OLE DB Provider.

Замечание
Для использования Visual FoxPro OLE DB Provider с CURSORTOXML( ), вы должны инсталлировать MSXML 3.0 на компьютер, на котором установлен OLE DB Provider.

CURSORTOXML() учитывает установки индексного упорядочивания, SET FIELDS TO и значение текущего фильтра. Однако он не сохраняет позицию указателя в записи в курсоре. После заверешения работы функции CURSORTOXML( ), если все записи были направлены в вывод, то указатель записи курсора устанавливается наконец файла (EOF), а в случае, если только часть записей была направлена в вывод, то на позицию последней направленной в вывод записи.

XML, полученный с помощью CURSORTOXML( ) содержит ту же самую размерность, что и экспортируемая таблица, если последняя содержит значения типа данных Double. Например, если колонка Double таблицы была создана с размерностью 6, используя приведенные ниже кодем, то конечный XML содержит шесть цифр справа от десятичной точки:

CREATE TABLE test (col1 b(6))

Уогда вы используете функцию CURSORTOXML( ) для экспорта таблицы или курсора в XML, корневой узел всегда получает имя "VFPData", независимо от формата вывода.

Вы можете экспортировать "ПУСТЫЕ" типы данных только для Date и DateTime используя функцию CURSORTOXML( ). Однако, проверка подлинности XML схемы может провалиться, так как "ПУСТОЙ" не является действительным значением в определении схемы XML - (XSD). Это справедливо только если схема требуется для работы, а результирующий XML проверяется XML parser'ом, который может интерпретирова схемы XSD. Для преодоления этого являения, вам может быть понадобится изменить данные в непустое представление, путем вызова соответствующей команды SELECT и использования CURSORTOXML() на созданном в результате этой команды курсоре. Например, вы можете изменить пустые Date или DateTime значения на .NULL.:

SELECT orderid, EVL(shippeddate,.NULL.) as ShippedDate FROM orders

Кроме того, вы модете изменить пустые Date или DateTime к подходящему для "пустого значения" представлению:

SELECT orderid, IIF(EMPTY(shippeddate),{^1899-12-30 00:00:00},tc11); 
   as ShippedDate FROM orders

При использовании флага 32768, установки флагов 16 и 32 могут оказывать воздействие на то, какая кодовая страница применена в зависимости от типов данных, записанных вами в XML. Приведенная ниже таблица показывает возможные комбинации установок и применение кодовой страницы для каждой комбинации.

Для XML-документов, созданных с установленным флагом 32768, применяются следующие кодовые страницы.

Flag 16Flag 32Flag 32768 установлен
Не установлен Не установлен XML-документы: Window-1252.
Данные Unicode: code page 1252.
Символьные данные: кодовая страница по-умолчанию, если поле не маркировано, как NOCPTRANS. (character binary)/(memo binary)
Установлен Не установлен XML-документы: Plus-CodePage property of the cursor. If XMLField CodePage property is greater than zero (0) and it doesn’t match the cursor’s code page, an error is reported.
Данные Unicode: значение свойства Code page объекта курсор.
Символьные данные: нет. Вместо этого используются текущие данные из таблиц Visual FoxPro (.dbf).
Не установлен Установлен XML-документы: UTF-8 code page.
Данные Unicode: UTF-8 code page.
Символьные данные: кодовая страница по-умолчанию, если поле не маркировано, как NOCPTRANS, в случае чего не происходит дополнительной трансляции символов в UTF-8.
Set Set XML-документы: UTF-8 code page.
Данные Unicode: UTF-8 code page.
Символьные данные: кодовая страница по-умолчанию, если поле не маркировано, как NOCPTRANS. (character binary)/(memo binary), в случае чего данные транслируются в UTF-8 с использованием установки SYS(3005).

Для XML-документов, созданных без установки флага 32768, используются следующие кодовые страницы:

Flag 16Flag 32Flag 32768 не установлен
Не установлен Не установлен XML-документы: Window-1252.
Данные Unicode: code page 1252.
Символьные данные: кодовая страница по-умолчанию, если поле не маркировано, как NOCPTRANS. (character binary)/(memo binary)
Установлен Не установлен XML-документы: значение свойства CodePage курсора. If XMLField CodePage property is greater than zero (0) and it doesn’t match the cursor’s code page, an error is reported.
Данные Unicode: значение свойства Code page объекта курсор.
Символьные данные: нет. Вместо этого используются текущие данные из таблиц Visual FoxPro (.dbf).
Не установлен Установлен XML-документы: UTF-8 code page.
Данные Unicode: UTF-8 code page.
Символьные данные: кодовая страница по-умолчанию, если поле не маркировано, как NOCPTRANS, в случае чего не происходит дополнительной трансляции символов в UTF-8.
Set Set XML-документы: UTF-8 code page.
Данные Unicode: UTF-8 code page.
Символьные данные: кодовая страница по-умолчанию, если поле не маркировано, как NOCPTRANS. (character binary)/(memo binary), в случае чего данные транслируются в UTF-8 с использованием установки SYS(3005).

Ох уж эта документация - сравните две последние таблицы и, как говорится, "найдите 100 отличий". Я специально не стал переводить вторые строки таблицы. Мы еще вернемся к этому чуть позже

Удобная и быстрая функция, но вы можете работать только с одной таблицей. Если же вам требуется испортировать в один файл несколько таблиц, то вам необходимо работать с новым очень удобным классом - XMLAdapter, о котором мы поговорим в одной из следующих статей.



Cелектор для быстрого перехода на сайты, связанные с Visual FoxPro.