Невозможно импортировать XML-файл с использованием атрибутов в Access

Примечание

Office 365 ProPlus переименован в Майкрософт 365 корпоративные приложения. Для получения дополнительной информации об этом изменении прочитайте этот блог.

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

Эта статья относится к файлу базы данных Microsoft Access (. mdb) или к файлу базы данных Microsoft Access (ACCDB).

Симптомы

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

Причина

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

Решение

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

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

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

  1. Создайте новую пустую базу данных и назовите ее Импортадоксмл. mdb.

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

    Note (Примечание ) В 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

  1. Сохраните модуль как Баскреатеадоксмл.
  2. В редакторе Visual Basic выберите окно Интерпретация в меню вид, чтобы открыть окно Интерпретация.
  3. Введите следующий код в окне Интерпретация и нажмите клавишу ВВОД:
    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>

  1. Сохраните документ как Адоксмлтоакцесс. xsl в той же папке, в которой вы сохранили базу данных Импортадоксмл. 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 и откройте базу данных Импортадоксмл. mdb, созданную ранее.

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

    Note (Примечание ) В 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

  1. В редакторе Visual Basic выберите окно Интерпретация в меню вид, чтобы открыть окно Интерпретация.
  2. Введите следующий код в окне Интерпретация и нажмите клавишу ВВОД:
    ImportXMLFromADO
    
    Обратите внимание , что таблица, содержащая клиентов из Великобритании с указанным именем, импортируется в Access. При необходимости вы можете удалить XML-документ, основанный на элементе, который создается во время преобразования.

Статус

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

Ссылки

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