Вы можете более легким способом обмениваться данными между другими приложениями путем преобразования данных Visual FoxPro в XML формат. Visual FoxPro включает в себя приведенные ниже функции, которые позволят вам осуществлять упомянутые преобразования:

Замечание:
Перед использованием указанных XML функций Visual FoxPro, вы должны установить парсер Microsoft XML Core Services (MSXML).

В приведенных ниже разделах обсуждаются соображения, которые необходимо учитывать при преобразованиях между XML и данными Visual FoxPro:

Вы можете замещать внутреннюю функциональность функций CURSORTOXML( ), XMLTOCURSOR( ) и XMLUPDATEGRAM( ) путем ссылки на компонент COM, используя свойство VFPXMLProgID. Для получения более подробной информации обратитесь к статье VFPXMLProgID Property.

Visual FoxPro поддерживает иерархически форматированные XML дляr XML DiffGram и форматов .NET Framework ADO.NET DataSet, путем предоставления классов XMLAdapter, XMLTable и XMLField. Для получения более подробной информации обратитесь к статье XML Functionality Using XMLAdapters.

Преобразование XML данных в переменные или строки, вместо преобразования в файлы

XMLTOCURSOR( ) по-разному обрабатывает данные из переменных и строк, по сравнению с преобразованием из файлов. При преобразовании XML в курсор, the method used to pass XML to the function affects how double-byte character sets (DBCS) characters in the XML are handled. DBCS символы интерпретируются корректно, когда для XMLSource используется файл. Однако, если вам необходимо использовать переменные памяти или строки, вы можете принудительно выполнить интерпретацию в DBCS с использованием приведенного ниже кода, в XMLTOCURSOR( ):

  Скопировать код
STRCONV(string,11)

Приведенный далее пример открывает Visual FoxPro образцовую таблицу Customer, размещенную в каталоге Visual FoxPro ..\Samples\Data\, преобразует данные таблицы и сохраняет их в переменной памяти, lcXML,  как XML:

  Скопировать код
CLEAR
CLOSE DATABASES ALL
USE HOME()+'samples\data\customer'
CURSORTOXML('customer','lcXML',1,48,5,"","","")

Приведенная ниже строка кода вставляет некорректные символы в результирующий курсор:

  Скопировать код
XMLTOCURSOR(lcXML,"curCustomerList",4)

Приведенная далее строка кода использует функцию STRCONV( ) и корректно преобразует XML в данные DBCS и открывает окно просмотра таблицы:

  Скопировать код
XMLTOCURSOR(STRCONV(lcXML,11),"curCustomerList",4) 
BROWSE

Преобразование XML строк

XMLTOCURSOR( ) не производит автоматических преобразований XML строк, например, из ANSI в UTF-8. Такое может произойти при чтении XML строки из файла. Для осуществления преобразования используйте в этом случае функцию STRCONV( ).

Приведенный ниже пример демонстрирует ошибку парсера, которая наступает в случае, когда Visual FoxPro встречает первый ASCII символ:

  Скопировать код
CLOSE DATABASE ALL
USE HOME(2)+"\data\customer"
CURSORTOXML("customer","lcXML",1,32)
STRTOFILE(lcXML,"customer.xml")
XMLTOCURSOR("customer.xml","curCustomer",512)
RETURN

Вы можете предотвратить ошибку парсера, генерируемую при преобразовании строк в UTF-8 когда XML записывается или когда он записан в файл. Приведенный ниже пример преобразует строку в UTF-8 как если бы она была записана в файл, путем использования фукнции STRCONV( ) совместно с функцией STRTOFILE( ):

  Скопировать код
CLOSE DATABASE ALL
USE HOME(2)+"\data\customer"
CURSORTOXML("customer","lcXML",1,32)
STRTOFILE(STRCONV(lcXML,9),"customer.xml")
XMLTOCURSOR("customer.xml","curCustomer",512)
RETURN

В примере вы можете использование значен6ие, равное 48 лоя параметра nFlag, передаваемом в функцию STRCONV( ) для создания XML кодированного как UTF-8. Однако, это не работает в случае XML, предоставленного как внешний источник или с XML, который не сгенерирован с помощью фукнции CURSORTOXML( ).

Для получения более подробной информации смотрите описание функции STRCONV( ).

Импортирование и экспортирование XML с использованием схем

Когда вы импортируете XML, используя фукнцию XMLTOCURSOR( ), Visual FoxPro использует внешнюю или внутреннюю схемы, если они доступны, для определения структуры курсора или таблицы перед производством простого прохода по данным для преобразования. Если не схема не предоставлена, Visual FoxPro производит двойной проход по данным XML: во время первого прохода определяется структура данных в наилучшем возможном направлении и только во втором производится собственно преобразование. XML должен, в общем случае, соответствовать формату, который может быть интерпретирован как таблица в дополнение к тому, что он должен быть хорошо сформирован. Хорошо сформированный XML, который не может быть слегко разложен в таблицу не будет обработан при импорте.

Приведенное ниже представляет собой XSD схему, сгенерированную посредством функции CURSORTOXML( ) Visual FoxPro:

  Скопировать код
<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<xsd:schema id="VFPSchema" targetNamespace="http://microsoft.com" xmlns="http://microsoft.com" xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" elementFormDefault="qualified">
<xsd:element name="atxm">
<xsd:complexType>
<xsd:all>
<xsd:element name="ikey" minOccurs="0" type="xsd:int"/>
<xsd:element name="nc00" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:precision value="10"/>
<xsd:scale value="4"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="mc03" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="2147483647"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="cc04" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="128"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="lc05" minOccurs="0" type="xsd:boolean"/>
<xsd:element name="fc06" minOccurs="0" type="xsd:double"/>
<xsd:element name="yc07" minOccurs="0" type="xsd:decimal"/>
<xsd:element name="ic08" minOccurs="0" type="xsd:int"/>
<xsd:element name="bc09" minOccurs="0" type="xsd:double"/>
<xsd:element name="dc10" minOccurs="0" type="xsd:date"/>
<xsd:element name="tc11" minOccurs="0"
type="xsd:timeInstant"/>
<xsd:element name="ts12" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:binary">
<xsd:encoding value="base64"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:element name="VFPData" msdata:lsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="atxm"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>

В настоящее время, Visual FoxPro экспортирует XML в следующие форматы:

  • Element-centric   Каждое поле в результирующем курсоре или в курсоре источнике или таблице представлено как суб-элемент элемента верхнего уровня.

      Скопировать код
    <?xml version="1.0" encoding="Windows-1252" standalone="yes" ?>
    <!-- Note targetNamespace in root (VfpData) element. If set to default (""), xmlns attrib is not written -->
    <VfpData xmlns="http://www.microsoft.com">
    <alltypesxm>
    <ikey>2</ikey>
    <nc00>1.1111</nc00>
    <mc03>H1111111111111111111</mc03>
    <cc04>H111111111111111111</cc04>
    <lc05>true</lc05>
    <fc06>-1111000</fc06>
    <yc07>-111111111.1111</yc07>
    <ic08>-11111111</ic08>
    <bc09>-111111111111.1</bc09>
    <dc10>1999-03-02T08:00:00</dc10>
    <tc11>1999-03-02T09:01:01</tc11>
    <ts12>AAAAAAAAAr8=</ts12>
    </alltypesxm>
    </VfpData>
  • Attribute-centric   Курсор определяется ключевым словом "VFPData" и каждое поле в результирующем курсорку или курсоре-источнике или таблице представлено аттрибутами элемента VFPData.

      Copy Code
    <?xml version="1.0" encoding="Windows-1252" ?>
    <!-- Note targetNamespace in root element -->
    <VFPData xmlns="http://www.microsoft.com">
    <atxm_attr ikey="2" nc00="12345.1111"
    mc03="H1111111111111111111" cc04="H111111111111111111" lc05="1"
    fc06="-1111000.0000" yc07="-111111111.1111" ic08="-11111111"
    bc09="-111111111111.100000" dc10="1999-03-02"
    tc11="1999-03-02T01:01:01" ts12="AAAAAAAAAr0=" />
    <atxm_attr ikey="3" nc00="2.1111" mc03="H2222222222222222222"
    cc04="H222222222222222222" lc05="1" fc06="22220000.0000"
    yc07="2222222222.2222" ic08="222222222"
    bc09="222222222222.2200000"
    tc11="2000-10-03T02:02:02" ts12="AAAAAAAAAr8=" />
    </VFPData>
  • Raw   Каждая строка в результирующем курсоре или курсоре-источнике или таблице представлена элементом XML с общим идентификатором "row", а каждая колонка размечена в аттрибуты элемента row, где имя аттрибуте соответствует имени колонки. Этот формат идентичен Attribute-centric, за исключением для "row", используемом в качестве элемента верхнего уровня.

      Скопировать код
    <?xml version="1.0"?>
    <!-- Note no targetNamespace in root element -->
    <VFPData>
    <row CustomerID="CACTU" CompanyName="Cactus Comidas para llevar"
    ContactName="Patricio Simpson" ContactTitle="Sales Agent"
    Address="Cerrito 333" City="Buenos Aires" PostalCode="1010"
    Country="Argentina" Phone="(1) 135-5555" Fax="(1) 135-4892"/>
    </VFPData>

Смотрите также