Невозможно импортировать атрибутивный XML-код в Access

Дополнительно: требуются экспертные навыки программирования, взаимодействия и многопользовательских навыков.

Эта статья применима к файлам баз данных Microsoft Access (.mdb) или (.accdb).

Симптомы

При импорте XML-документа импортируется по крайней мере одна пустая таблица или импортируются не все данные. В зависимости от структуры XML-документа фактически может быть импортировано несколько таблиц.

Причина

При импорте пустой таблицы обычно указывается, что данные исходного XML-документа ориентированы на атрибуты. Microsoft Access поддерживает только xml-код, ориентированный на элементы. XML-код, сохраняемый из наборов записей ADO, создается в xml-коде, ориентированном на атрибуты.

Разрешение

В этой статье показано, как импортировать XML-данные, созданные путем сохранения набора записей ADO в формате XML. Преобразование, представленное в этой статье, применяется к сохраняемого формата ADO XML.

Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Специалисты технической поддержки Майкрософт могут пояснить работу той или иной процедуры, но модификация примеров и их адаптация к задачам разработчика не предусмотрена. Чтобы импортировать атрибутивный XML-код в Access, необходимо сначала создать и применить преобразование XML (XSLT) к исходному документу. Этот процесс создает новый XML-документ, который ориентирован на элементы и может быть импортирован в Access.

Создание XML-документа из ADO

  1. Создайте пустую базу данных и назовите ее ImportADOXML.mdb.

  2. В меню Вставка выберите пункт Модуль.

    Примечание В Access 2007 щелкните Макрос в группе Другие на вкладке Создание , а затем — Модуль.

  3. В Редактор Visual Basic введите или вставьте следующий код в новый модуль:

     Sub CreateADOXML()
      'Persists an ADO recordset to XML
      Dim cn As ADODB.Connection
      Dim rs As ADODB.Recordset
    
     'Open an ADO Connection object
     'If the path to Northwind differs on your machine, you will need to
     'adjust the Data Source property accordingly.
     Set cn = New ADODB.Connection
     With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=C:\Program Files\Microsoft " & _
          "Office\Office10\Samples\Northwind.mdb"
        .Open
     End With
    
     'Open an ADO Recordset
     Set rs = New ADODB.Recordset
     With rs
        Set .ActiveConnection = cn
        .Source = "SELECT * FROM Customers WHERE Country='UK'"
        .CursorLocation = adUseServer
        .CursorType = adOpenForwardOnly
        .LockType = adLockReadOnly
        .Open
        'persist the recordset to XML
        .Save "C:\ado_customersUK.xml", adPersistXML
        .Close
     End With
    
     'Cleanup
     cn.Close
     Set rs = Nothing
     Set cn = Nothing
     End Sub
    
  4. Сохраните модуль как basCreateADOXML.

  5. В Редактор Visual Basic щелкните Окно интерпретации в меню Вид, чтобы открыть окно Интерпретация.

  6. Введите следующий код в окне Интерпретация и нажмите клавишу ВВОД:

    CreateADOXML
    

Создание преобразования XSL

Так как пространства имен, определенные ADO, не распознаются Access, следующее преобразование определяет эти пространства имен, но исключает их из полученных выходных данных.

  1. Запустите Блокнот и введите следующий код XSLT:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:rs="urn:schemas-microsoft-com:rowset"
     exclude-result-prefixes="rs">
    
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     <xsl:template match="/">
     <!-- root element for the XML output -->
     <rootElement xmlns:z="#RowsetSchema" xsl:exclude-result-prefixes="z">
    
     <!-- for each z:row element in the ADO output -->
     <xsl:for-each select="/xml/rs:data/z:row">
    
     <!--
           This will be used for the table name imported into Access.
           Change this name to suit your needs.
          -->
         <TableName>
             <!-- 
               for each attribute of the z:row element in the ADO XML document
               -->
             <xsl:for-each select="@*">
    
     <!-- 
                   dynamically create elements and fill with attribute 
                   value using the XPath name() function
                  -->
                 <xsl:element name="{name()}">
                     <xsl:value-of select="."/>
                </xsl:element>
    
     </xsl:for-each>
         </TableName>
    
     </xsl:for-each>
     </rootElement>
     </xsl:template>
     </xsl:stylesheet>
    
    
  2. Сохраните документ как ADOXMLToAccess.xsl в той же папке, в которой сохраняется база данных ImportADOXML.mdb.

Применение преобразования и импорта

Чтобы применить преобразование XSL, необходимо использовать процессор XSLT, например microsoft MSXML3, который устанавливается вместе с Microsoft Office XP. В следующих шагах используется объектная модель xml-документов для применения созданного ранее преобразования к XML-документу ADO и его импорта в Access.

Примечание.

В примере кода в этой статье используется объектная модель xml-документов. Для правильного выполнения этого кода необходимо сослаться на библиотеку Microsoft XML 3.0. Для этого щелкните Ссылки в меню Сервис в Редактор Visual Basic и убедитесь, что выбрано поле Microsoft XML, версия 3.0 проверка.

  1. Запустите Microsoft Access и откройте базу данных ImportADOXML.mdb, созданную ранее.

  2. В окне База данных в разделе Объекты щелкните Модули, а затем нажмите кнопку Создать.

    Примечание В Access 2007 щелкните Макрос в группе Другие на вкладке Создание , а затем — Модуль.

  3. В Редактор Visual Basic введите или вставьте следующий код в модуль:

    Sub ImportXMLFromADO()
    
    'Uses the XML DOM to transform XML from ADO
     'to element-centric XML and imports into Access
     Dim domIn As DOMDocument30
     Dim domOut As DOMDocument30
     Dim domStylesheet As DOMDocument30
    
     Set domIn = New DOMDocument30
    
     domIn.async = False
    
     'Open the ADO xml document
     If domIn.Load("C:\ado_customersUK.xml") Then
    
     'Load the stylesheet
         'In this example you will need to change <PathToStylesheet> to
         'the actual path where you stored the ADOXMLToAccess.xsl file.    
         Set domStylesheet = New DOMDocument30
         domStylesheet.Load "<PathToStylesheet>\ADOXMLToAccess.xsl"
    
     'Apply the transform
         If Not domStylesheet Is Nothing Then
             Set domOut = New DOMDocument30
             domIn.transformNodeToObject domStylesheet, domOut
    
     'Save the output
             domOut.Save "c:\customersUK.xml"
    
     'Import the saved document into Access
             Application.ImportXML "c:\customersUK.xml"
         End If
     End If
    
     'Cleanup
     Set domIn = Nothing
     Set domOut = Nothing
     Set domStylesheet = Nothing
    
     MsgBox "done!", , "ImportXMLFromADO"
     End Sub
    
  4. В Редактор Visual Basic щелкните Окно интерпретации в меню Вид, чтобы открыть окно интерпретации.

  5. Введите следующий код в окне интерпретации и нажмите клавишу ВВОД:

    ImportXMLFromADO
    

    Обратите внимание , что таблица, содержащая клиентов из Соединенного Королевства с именем, указанным в параметре <TableName> , импортируется в Access. При необходимости можно удалить элементный XML-документ, созданный во время преобразования.

Статус

Такое поведение является особенностью данного продукта.

Ссылки

Дополнительные сведения о сохранении набора записей ADO в XML см. в разделе Сохранение записей в формате XML.