В рассмотренном примере XML передавался от ADO к DOM через внешний файл. В ADO 2.5 появилась
возможность сохранения recordset'a в виде XML не только в файл, но и в любой объект, поддерживающий
интерфейс IStream. В Скрипте 2
static void Save_ADODBRecordset_XMLStream()
{
...
MSXML2.DOMDocument40Class xmlDoc = new MSXML2.DOMDocument40Class();
rst.Save(xmlDoc, ADODB.PersistFormatEnum.adPersistXML);
cnn.Close();
MSXML2.DOMDocument40Class xslDoc = new MSXML2.DOMDocument40Class();
xslDoc.loadXML("<?xml version='1.0' ?>" +
"<doc xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xsl:version='1.0'>" +
"<xsl:copy-of select='//*[@ContactName=\"Maria Larsson\"]'/></doc>");
FileInfo f = new FileInfo("..\\Results\\ADODBRecordset_XMLStream.xml");
StreamWriter sw = f.CreateText();
sw.Write(xmlDoc.transformNode(xslDoc));
sw.Close();
...
}
Скрипт 2
recordset записывается в поток объекта DOMDocument из СОМовской библиотеки MSXML4
(WINNT\System32\msxml4.dll). Полученный из recordset'a xmlDoc затем подвергается XSLT-преобразованию,
заданному в xslDoc, которое выбирает все элементы, относящиеся к заказчику Maria Larsson. Полученная в
результате преобразования строка записывается в файл, который отображается в браузере.
Возможна и обратная ситуация - чтение XML из потока и его запись в recordset. Это было достигнуто за счет
введения нового сервисного провайдера Microsoft OLE DB Persistence Provider ("Provider=MSPersist"). Простота
сохранения recordset'a в XML накладывает в то же время ограничения: ADO жестко задает схему генерируемого
документа (см. еще раз рис.1). Это плоский XML. Несмотря на отношения между таблицами, названия
элементов не несут никакой информации о самих таблицах, ограничиваясь безликим , и
т.д., так что для внятного отображения, скорее всего, требуется XSL-преобразование.
|
|