XMLAdapter представляет собой класс с "двухсторонним движением". Вы можете импортировать XML и содержащуюся в нем схему или вы можете создать и сгенерировать XML из таблиц.

Объект XMLAdapter хранит объектную ссылку на схему XML (XML Schema) и узлы объектной модели документа (DOM). То есть он не хранит информацию о реальной схеме или содержании. Объект XMLAdapter содержит коллекцию Tables, которая, в свою очередь, содержит один или более объектов XMLTable и описывает XML, как курсор Visual FoxPro вместе с любой связанной информацией. Каждый объект XMLTable может также содержать дочерний XMLTable, и, самое большее, коллекцию Fields с одним или более объектами XMLField.

NoteЗамечание

Класс XMLAdapter требует, чтобы в системе был установлен Microsoft XML Core Services (MSXML) 4.0 Service Pack 1 (SP1) или более поздний.

С использованием класса XMLAdapter, вы можете выполнять следующие задачи:

XMLAdapter

Expand imageПримечания

Если вы используете объект XMLAdapter для конвертирования схемы XDR в схему XSD, вы должны изменить значение свойства XMLNamespace объекта XMLAdapter; в противном случае, XML-парсер не сможет перезагрузить XML. Приведенный ниже пример иллюстрирует такой сценарий:

  CopyCode imageСкопировать код
TEXT TO cXML NOSHOW
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
<s:AttributeType name='xmlfield' rs:number='1' rs:writeunknown='true' rs:nullable='true'>
<s:datatype dt:type='number' rs:dbtype='currency' dt:maxLength='8'
rs:scale='4' rs:precision='6' />
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row xmlfield='12.12'/>
</rs:data>
</xml>
ENDTEXT
CLOSE DATABASES ALL
CLEAR
LOCAL oXMLAdapter as XMLAdapter
oXMLAdapter = NEWOBJECT('XMLAdapter') oXMLadapter.LoadXML(cXML) IF oXMLAdapter.Tables.Item(1).Fields.Item(1).DataType <> "Y" THEN
? 'Failed'
ELSE
oXMLAdapter.Tables.Item(1).ToCursor()
oXMLAdapter.XMLNamespace=""
oXMLAdapter.ReleaseXML(.F.) oXMLAdapter.XMLSchemaLocation='c:\myxmlfile.xsd'
oXMLAdapter.ToXML('c:\myxmlfile.xml',,.T.) oXMLadapter2 = NEWOBJECT('xmladapter') oXMLAdapter2.XMLSchemaLocation='c:\myxmlfile.xsd'
oXMLAdapter2.LoadXML('c:\myxmlfile.xml',.T.,.T.) ENDIF

В случае, когда схема отсутствует или недоступна, вы можете указать какую-то схема, которую Visual FoxPro может использовать при конверсии, путем установки свойства XMLSchemaLocation объекта XMLAdapter. Вы должны определить значение этого свойства до вызова метода LoadXML. Когда Visual FoxPro исполняет метод LoadXML, то он ищет схему в следующем порядке:

  • Внутренняя схема

  • Внешняя схема, как указано в XML-документе

  • Схема, указанная в качестве значения свойства XMLSchemaLocation

Приведенный ниже пример создает объекта класса XMLAdapter с коллекцией таблиц Tables, которая остается пустой до тех пор, пока вы не загрузите действительный XML в объект класса XMLAdapter:

  CopyCode imageСкопировать код
oMyAdapter=CREATEOBJECT("xmladapter")

XML и данные XML-схемы, которые вы запрашиваете путем вызова метода  LoadXML  объекта класса XMLAdapter отсаются в памяти, до тех пор, пока они не будут замещены последующим вызовом метода LoadXML или до момента, когда они будут специально удалены, посредством вызова метода ReleaseXML объекта XMLAdapter.

Nested Tables (вложенные таблицы)    В приведенной ниже таблице описывается, как XMLAdapter обрабатывает вложенные таблицы, будь то индивидуальные таблицы или таблицы, полностью зависящие от источника данных XML.

Источник данных XML Описание

ADO.NET DataSet

XMLAdapter рассматривает каждую вложенную таблицу, как отдельную таблицу, которая может быть сконвертирована в курсор Visual FoxPro. При анализе XML-схемы, методы  LoadXML и Attach объекта XMLAdapter создают индивидуальные объекты XMLTable для каждой вложенной таблицы и добавляют их в коллекцию таблиц Tables. Вы можете использовать методы  ToCursor, ChangesToCursor и ApplyDiffgram объекта XMLTable для получения данных для каждой таблицы.

SQL XML

XMLAdapter рассматривает каждую вложенную таблицу, как неотделимую от родительской таблицы. Когда запрашиваются данные, окончательный результат операции объединения (join) между этими таблицами представляет собой единичный результат. Если имеется множественный уровнь вложенности, такой как в случае, если дочерняя таблица содержит свою дочернюю таблицу и так далее, этот единичный результат содержит данные из операции объединения всех таблиц в иерархии.

Методы LoadXML и Attach объекта XMLAdapter создают объекта XMLTable для всех таблиц. Однако, в коллекцию Tables вводится только объект XMLTable для родильской таблицы верхнего уровня. Этот объект XMLTable обозначает родительскую таблицу и обеспечивает доступ к единичному и окончательному результату операции объекдинения посредством использования метода ToCursor объекта XMLTable. Объекты XMLTable для дочерних таблиц связываются с родительской таблицей через свойства ChildTable и ParentTable. Однако, не существует пути, для получения данных из индивидуальных таблиц в цепочке иерархии.

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