Описание XML-функций в Visual FoxPro
« Назад Функция CURSORTOXML(nWorkArea | cTableAlias, cOutput [, nOutputFormat
|
nOuputFormat |
Описание |
1 |
Ориентированный на элемент формат (по умолчанию) |
2 |
Ориентированный на атрибут формат |
3 |
Построчный формат |
nFlags – определяет способ форматирования XML-документа и вид результата (в виде файла или переменной). Задается как сумма указанных в табл. 20.5 флагов.
Таблица 20.5
Значения для параметра nFlags
Флаг |
Биты |
Описание результата |
0 |
0000 |
Формирует XML в формате UTF-8 (по умолчанию). |
1 |
0001 |
Формирует неформатированный XML в виде непрерывной строки |
2 |
0010 |
Оформляет пустые элементы в виде начального и конечного тегов, например <cc04><cc04/> |
4 |
0100 |
Сохраняет пробелы в полях данных |
8 |
1000 |
Сохраняет значение memo-поля в секции CDATA |
16 |
10000 |
Атрибут encoding результата устанавливается равным кодовой странице курсора. strxml = Strtran(strxml, 'encoding=""', 'encoding="gb2312"') |
32 |
100000 |
Выполняется кодирование результата |
512 |
1000000000 |
Результат направляется в файл, заданный параметром cOutput |
4096 |
1000000000000 |
Не используется base64-кодирование. |
32768 |
– |
Означает, что должна быть использована кодовая страница |
В табл. 20.6 показано, как записывается атрибут encoding, когда результат имеет ту же кодовую страницу, что и курсор или таблица VFP.
Таблица 20.6
Значения параметра nFlags
nFlags |
Биты |
Описание |
0 |
000000 |
Кодовая страница Windows-1252 (по умолчанию) |
16 |
010000 |
Атрибут encoding результата устанавливается равным кодовой странице курсора |
32 |
100000 |
Атрибут encoding результата устанавливается в UTF-8. Преобразований символьных данных не выполняется |
48 |
110000 |
Атрибут encoding результата устанавливается в UTF-8. Символьные данные преобразовываются в UTF-8. Такое преобразование нужно, когда данные содержат 2-байтовые символы |
В табл. 20.7 приводятся Windows-совместимые кодовые страницы и соответствующие им значения атрибута encoding.
Таблица 20.7
Соответствия Windows-совместимых кодовых страницы
и значений XML-атрибута encoding
Кодовая страница |
Платформа |
Атрибут encoding |
437 |
MS-DOS, US |
ibm437 |
850 |
MS-DOS, International |
ibm850 |
865 |
MS-DOS, Nordic |
Пустая строка ("") |
866 |
MS-DOS, Russian |
cp866 |
932 |
Windows, Japanese |
shift-jis |
936 |
Traditional Chinese |
gb2312 |
949 |
Windows, Korean |
iso-2022-kr или ks_c_5601-1987 |
950 |
Windows, Chinese (Taiwan) |
big5 |
1250 |
Windows, East European |
Windows-1250 |
1251 |
Windows, Russian |
Windows-1251 |
1252 |
Windows, U.S., West European |
Windows-1252 |
1253 |
Windows, Greek |
Windows-1253 |
1254 |
Windows, Turkish |
Windows-1254 |
1255 |
Windows, Hebrew |
Windows-1255 |
1256 |
Windows, Arabic |
Windows-1256 |
nRecords – число записей, передаваемых результату. Если параметр опущен или равен нулю, или больше числа имеющихся в таблице записей, то передаются все записи.
cSchemaName – задает имя и положение информации о схеме. Принимает приведенные в табл. 20.8 значения.
Таблица 20.8
Значения параметра cSchemaName
cSchemaName |
Описание |
"" |
Схема не формируется |
"1" |
Формируется внутренняя, расположенная в cOutput схема |
<cSchemaName> |
Задает имя файла, в который будет выгружена схема |
Если параметр cSchemaLocation опущен или задан в виде пустой строки, а параметр cSchemaName содержит имя файла, то значение cSchemaName записывается в XML-атрибут xsi:SchemaLocation или xsi:noNamespaceSchemaLocation.
Примеры:
CursorToXML("Labels", "MyXMLFile.xml", 1, 512, 0, "MySchema.xsd")
CursorToXML("Labels", "MyXMLFile.xml", 1, 512, 0, "1")
Если в cSchemaName включен URI (Uniform Resource Identifier – унифицированный идентификатор ресурса), то схема записывается в текущую директорию и должна быть передана серверу, чтобы стать доступной браузеру или синтаксическому анализатору. Внешняя схема всегда записывается с то же место, что и XML-файл.
cSchemaLocation – задает адрес, по которому приложение, читающее XML-документ, должно искать файл со схемой. Параметр используется, когда схема и XML-файл имеют разное расположение.
Значение cSchemaLocation записывается в XML-атрибут xsi:SchemaLocation или xsi:noNamespaceSchemaLocation XML-файла с данными. Параметр cSchemaLocation может быть HTTP-адресом или другим URI-значением. Необходимо скопировать файл со схемой по адресу, указанному параметром cSchemaLocation.
Пример. Выполнение функции
CursorToXML("LABELS", "myXMLFile.xml", 1, 512, 0, ;
"mySchema.xsd", "http://www.microsoft.com/mySchema.xsd")
вызовет появление XML-файла, содержащего следующий атрибут:
xsi:noNamespaceSchemaLocation="http://www.microsoft.com/mySchema.xsd"
Задание cSchemaLocation при пустом значении cSchemaName приведет к появлению того же атрибута в XML-файле. Это позволяет указывать на существующую схему без ее повторной генерации при неоднократных вызовах CURSORTOXML( ) для одного и того же курсора (таблицы).
cNamespace – задает пространство имен XML или формируемую схему. По умолчанию равен пустой строке.
Задание параметра cNameSpace устанавливает в атрибут targetNamespace значение параметра и добавляет в схему атрибут elementFormDefault="qualified".
Если параметр cNamespace не задан и генерируется внешняя схема, то декларация пространства имен в схеме будет отсутствовать; если же схема встроенная, то в атрибут targetNamespace будет установлена строка нулевой длины.
Функция CURSORTOXML( ) соблюдает установки SET ORDER, SET FIELDS и SET FILTER. После выполнения функции курсор позиционируется в конце файла, если выгружены все записи, или на последней выгруженной записи.
Независимо от формата данных корневой элемент всегда имеет имя "VFPData".
Результирующий XML в случае полей типа Double содержит ту же точность, что и поле таблицы типа Double.
В случае полей типа Date и DateTime можно выгружать пустые значения. Однако при проверке схемы может возникнуть ошибка, поскольку пустое значение не является допустимым для таких типов (эта проблема актуальна, когда требуется схема и XML-документ проверяется XML-синтаксическим анализатором, интерпретирующим схему).
Чтобы избежать этой проблемы, можно использовать подходящий SELECT – SQL для формирования курсора и затем употребить с ним CURSORTOXML( ). Например, можно заменить пустые даты на NULL, например:
select OrderId, Evl(ShippedDate, .NULL.) as ShippedDate from Orders
Также можно заменить пустую дату некоторой фиктивной величиной, например:
select OrderId, Iif(Empty(ShippedDate), {^1899–12–30 00:00:00}, ShippedDate) ;
as ShippedDate from Orders
Функция
XMLTOCURSOR(eExpression | cXMLFile [, cCursorName [, nFlags]])
преобразовывает XML-документ, заданный параметром eExpression | cXMLFile, в курсор или таблицу VFP.
Функция возвращает число созданных записей.
Параметры:
eExpression – корректный XML-текст. Параметр может быть переменной VFP, memo-полем, либо результатом HTTP-запроса, выполнения SOAP-метода, XMLDOM или ADO-потока. XMLCURSOR( ) генерирует ошибку, если XML-документ не найден или если eExpression не проходит синтаксический контроль.
cXMLFile – имя XML-файла.
cCursorName – имя курсора для записи результата. Если курсор уже существует и открыт, то VFP закрывает курсор и затем создает новый в неиспользуемой рабочей области. Если параметр опущен или задан в виде пустой строки, то VFP создаст курсор с именем XMLResult.
Если nFlags = 8192 и если курсор cCursorName содержит данные, VFP добавляет импортируемые данные в существующий курсор или таблицу. Курсор (таблица) должен быть открыт. Если cCursorName – это пустая строка и nFlags = 8192, то VFP импортирует данные в курсор или таблицу, открытую в текущей рабочей области.
nFlags – определяет, как eExpression обрабатывается XMLTOCURSOR( ). Задается как сумма приведенных в табл. 20.9 флагов.
Таблица 20.9
Значения для параметра nFlags
Флаг |
Биты |
Описание |
0 |
0000 |
Обрабатывает первый параметр как строку, содержащую XML-данные (по умолчанию) |
4 |
0100 |
Сохраняет пробелы в данных; отключает действие атрибута xml:space XML-данных |
512 |
01000000000 |
Указывает, что первый параметр (eExpression | cXMLFile) – это строка, содержащая имя файла с XML-данными |
1024 |
10000000000 |
Создает character- или memo-поля в результирующем курсоре с опцией NOCPTRANS и вставляет в них XML-значения без преобразования кодовой страницы. |
2048 |
100000000000 |
Используется, когда импортируемые данные имеют XSD-схему, содержащую десятичные данные со следующими ограничениями: totalDigits="19" и fractionDigits="4" В этом случае XSD-тип данных в результирующем курсоре будет представлен как VFP-тип данных Currency |
4096 |
1000000000000 |
Отменяет base64-декодирование (в VFP base64-кодирование применяется только для двоичных данных) |
8192 |
1100000000 |
Указывает, что cCursorName – это имя (или псевдоним) существующей таблицы или курсора, в который будут импортироваться XML-данные (см. описание параметра cCursorName). |
32768 |
0x8000 |
Означает, что должна быть использована кодовая страница |
65536 |
0x10000 |
Переводит XML-Char поля в VFP Varchar-поля. Если не задан, то XML-Char поля будут переведены в VFP Character-поля |
131072 |
0x20000 |
Переводит XML-base64Binary поля в VFP Varbinary-поля, если длина поля менее 255 символов, или в Blob-поля – в противном случае. Если не задан, то XML-base64Binary поля будут переведены в VFP memo-поля |
Используя флаг 8192, необходимо принимать во внимание следующее:
Схема таблицы (курсора) должна отвечать поступающим XML-элементам; VFP согласовывает типы данных в соответствии с табл. 20.11. Импортирование несогласуемых типов данных приводит к генерации ошибки.
Если XML содержит ссылку на схему и типы данных в схеме конфликтуют с типами данных курсора (таблицы), то берутся типы данных курсора (таблицы).
Имена элементов XML-данных должны соответствовать именам столбцов курсора (таблицы). VFP импортирует данные только тех элементов, для которых выполняется приведенное условие.
Курсор (таблица) может иметь меньше столбцов, чем предусмотрено XML-файлом, но должен иметь по крайней мере один столбец, отвечающий XML-данным; может также содержать произвольное число столбцов, не имеющих соответствующих XML-элементов.
Если таблица содержит поля типа Integer (AutoInc), функция XMLTOCURSOR( ) не будет выполнена, если SET AUTOINCERROR установлен в ON. Установка SET AUTOINCERROR в OFF или отключение режима автоматического увеличения значения поля посредством функции CURSORSETPROP( ) позволяет выполнить XMLTOCURSOR( ).
VFP интерпретирует XML-данные со схемой или без нее. Схема используется для определения структуры таблицы. Схема берется либо как внутренняя из XML-файла, либо из внешнего файла. Если схемы нет, то импортирование выполняется за 2 прохода.
Символы длиной 2 байта правильно интерпретируется при импортировании данных из XML-файла. Если же источником XML-данных является переменная или строка, то для правильной интерпретации 2-байтовых символов следует применить функцию STRCONV( ), например как в следующем примере:
close databases all
use Home( ) + 'Samples\Data\Customer'
CursorToXML('Customer', 'lcXML', 1, 48, 5, "", "", "")
&& XMLTOCURSOR( ) помещает некорректные символы в результирующий курсор
XMLToCursor(lcXML, "curCustomerList", 4)
&& Используем STRCONV( ) в XMLTOCURSOR( ) для правильного
&& преобразования 2-байтовых символов
XMLToCursor(STRConv(lcXML, 11), "curCustomerList", 4)
browse last
Функция XMLTOCURSOR( ) не выполняет автоматического преобразования XML-строк, например, из ANSI в UTF-8. (Преобразование будет выполнено при чтении XML-данных из файла.) Чтобы выполнить преобразование XML-строки, следует употребить STRCONV( ).
Пример. При исполнении следующего кода синтаксический XML-анализатор генерирует ошибку в момент обнаружения первого ASCII-символа
close database all
use Home(2) + "\Data\Customer"
CursorToXML("Customer", "lcXML", 1, 32)
STRToFile(lcXML, "Customer.xml")
XMLToCursor("Customer.xml", "curCustomer", 512)
Ее можно предотвратить, выполнив функцией STRCONV( ) преобразование XML-строки в UTF-8 при ее записи в файл.
close database all
use Home(2) + "\Data\Customer"
CursorToXML("Customer", "lcXML", 1, 32)
STRToFile(STRConv(lcXML, 9), "Customer.xml")
XMLToCursor("Customer.xml", "curCustomer", 512)
browse last
При вызове XMLTOCURSOR( ) в режиме добавления записей VFP добавит пустую запись, если не будет найдено ни одного соответствующего столбца таблицы или курсора.
XMLTOCURSOR( ) генерирует ошибку, если число столбцов в XML-строке превышает допустимое значение, которое примерно равно 160. Его точная величина зависит от длины имен столбцов.
XMLTOCURSOR( ), создавая курсор, не использует тип Varchar, но поддерживает добавление данных в существующий с Varchar-полями.
XML-документы, имеющие внутреннюю XSD-схему, сгенерированную Visual Studio .NET DataSets, могут содержать элементы, не поддерживаемые VFP, например:
xs:unique name;
xs:annotation;
дополнительные инструкции и атрибуты, такие, как:
- поддержка префикса (например msdata:Prefix);
- атрибут msprop и другие использующие пространство имен атрибуты;
- другие атрибуты msdata, ссылающиеся на значения, не распознаваемые VFP, например msdata:Locale или msdata:Comment.
Такие элементы игнорируются.
Соответствие VFP- и XSD-типов данных описано в табл. 20.10.
Blob |
xs:base64Binary |
|
Content is translated to base64 encoding. Maps to SQL Binary. |
Таблица 20.10
Соответствие типов данных VFP и XSD
Тип VFP |
Тип XSD / ограничения |
Комментарий |
Blob |
xs:base64Binary <xs:element name="ts12" minOccurs="0"> |
Содержимое приобретает base64-кодировку |
Character |
xsd:string (с ограничением) <xsd:maxLength value="128"/> |
|
Currency |
xsd:decimal |
|
Numeric |
xsd:decimal (с ограничениями) <xsd:precision value="10"/> |
Точность – число цифр за вычетом десятичной точки |
Float |
" |
" |
Date |
xsd:date |
|
DateTime |
xsd:dateTime |
|
Double |
xsd:double |
|
Integer |
xsd:int |
|
Logical |
xsd:boolean |
|
Memo |
xsd:string (длиной более 254 символов) <xsd:maxLength value="2147483647"/> |
|
General |
Не поддерживается |
|
Character (binary) |
Binary (с ограничением) <xsd:encoding value="base64"/> |
|
Memo (binary) |
xsd:binaryBase64 <xsd:encoding value="base64"/> |
|
Varbinary |
xs:base64Binary <xs:element name="cc04" minOccurs="0"> |
Содержимое приобретает base64-кодировку |
Varchar |
xs:string <xs:element name="cc04" minOccurs="0"> |
|
Varchar (binary) |
" |
|
В табл. 20.11 описан порядок согласования типов данных при nFlags = 8192.
Таблица 20.11
Порядок согласования типов данных при nFlags = 8192
Тип данных VFP |
Поведение |
Character, Character (binary), Memo, Memo (binary) |
Принимаются любые данные. Данные, длина которых превышает длину символьного столбца, обрезаются |
Currency |
Принимает числовые данные в диапазоне, допустимом для типа Currency. Данные, выходящие из этого диапазона, обрезаются |
Date |
Принимает дату и дату и время в XML-формате. VFP преобразовывает XML-дату и дату и время в тип Date |
DateTime |
Принимает дату и дату и время в XML-формате. VFP преобразовывает XML-дату и дату и время в тип DateTime |
Double |
Принимает числовые данные в диапазоне, допустимом для типа Double. Данные, выходящие из этого диапазона, обрезаются |
Integer |
Принимает числовые данные в диапазоне, допустимом для типа Integer. Данные, выходящие из этого диапазона, обрезаются |
Logical |
Принимает значения True, .T., 1, False, .F. и 0 |
Numeric, Float |
Принимает числовые данные в диапазоне, допустимом для типов Numeric и Float. Данные, выходящие из этого диапазона, обрезаются или в случае переполнения замещаются соответствующими индикаторами – звездочками |
Замечание. Если XML-числовые данные содержат индикатор переполнения, например *****.**, то XMLTOCURSOR( ), если имеется схема, при импортировании такого значения заменяет его в зависимости от типа поля на 0.0 или 0.
Функция
XMLUPDATEGRAM([cAliasList [, nFlags [, cSchemaLocation]]])
отображает изменения, выполненные в буферизованной таблице, в XML UpdateGram.
Функция возвращает строку, содержащую значение XML UpdateGram.
XML UpdateGram содержит представления полей буферизованной таблицы или курсора до и после изменения.
Для употребления функции XMLUPDATEGRAM( ) необходимо установить SET MULTILOCKS в ON и активизировать буферизацию таблиц.
Пример. Создается курсор Test, устанавливаются его свойства, изменяются значения его полей mField, cField и iField и вызывается XMLUpdateGram( ).
set multiLocks on
set memoWidth to 80
create cursor Test (mField M, cField C(20), iField I)
append blank
CursorSetProp("Buffering", 5)
CursorSetProp("KeyFieldList", "cField")
replace mField with "Новое M-значение", ;
cField with "Новое C-значение" ;
iField with 5
? XMLUpdateGram( )
Результат, возвращаемый функцией XMLUPDATEGRAM( ):
<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<root xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync>
<updg:before>
<test>
<mfield/>
<cfield/>
<ifield>0</ifield>
</test>
</updg:before>
<updg:after>
<test>
<mfield>Новое M-значение</mfield>
<cfield>Новое C-значение</cfield>
<ifield>5</ifield>
</test>
</updg:after>
</updg:sync>
</root>
Замечание. Если опустить вызов
CursorSetProp("KeyFieldList", "cField")
то XMLUPDATEGRAM( ) вернет результат только для полей cField и iField; memo-поле mField в результат не попадет.
Параметры:
cAliasList – список, содержащий разделенные запятыми имена псевдонимов или номера рабочих областей открытых таблиц и курсоров, включаемых в UpdateGram. Если параметр опущен или задан в виде строки нулевой длины, то VFP использует все открытые таблицы и курсоры текущей сессии данных, содержащие буферизованные изменения.
nFlags – определяет способ форматирования результата. Задается как сумма приведенных в табл. 20.12 флагов.
Таблица 20.12
Значения для параметра nFlags
Флаг |
Биты |
Описание результата |
0 |
0000 |
Использует XML с форматированием UTF-8 (по умолчанию) encoding="Windows-1252" |
1 |
0001 |
Использует неформатированные данные – непрерывную строку XML |
2 |
0010 |
Представляет пустые элементы в виде комбинации начального и конечного тегов |
4 |
0100 |
Сохраняет пробелы в полях (ведущие и хвостовые) |
8 |
1000 |
Представляет значение memo-поля в секции CDATA |
16 |
10000 |
Выполняется кодирование результата с использованием текущей кодовой страницы |
32 |
100000 |
Выполняется кодирование результата encoding="UTF-8" |
В табл. 20.12 также показано, как записывается атрибут encoding, когда результат имеет ту же кодовую страницу, что и курсор или таблица VFP.
cSchemaLocation – имя и место размещения схемы.
Пример. Пусть для cSchemaLocation использовано значение "mySchema.xsd", тогда значение UpdateGram будет содержать mapping-schema-атрибут, такой же, что и приведенный в следующем фрагменте XML:
<root xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="mySchema.xsd">
<updg:before>
Перед вызовом XMLUPDATEGRAM( ) следует создать список первичных полей для всех открытых курсоров и таблиц, употребив CURSORSETPROP( ) с первым параметром равным "KeyFieldList". При его отсутствии memo-данные в XML UpdateGram включены не будут (см. вышеприведенный пример).
При работе с SQL Server необходимо явно указывать схему, чтобы передать SQL Server memo-данные XML UpdateGram.
XMLUPDATEGRAM( ) не поддерживает формат DiffGram, употребляемый в SQL Server и Visual Studio .NET для XML.
В отличие от CURSORTOXML( ) функция XMLUPDATEGRAM( ) игнорирует установки SET FIELDS.