Du kan inte importera xml-funktion som är centrerad i Access

Anteckning

Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.

Avancerat: Kräver expertkodning, interoperabilitet och fleranvändarfärdigheter.

Den här artikeln gäller en Microsoft Access-databasfil (.mdb) eller en Microsoft Access-databasfil (.accdb).

Symptom

När du importerar ett XML-dokument importeras minst en tom tabell eller så importeras inte alla data. Beroende på XML-dokumentets struktur kanske mer än en tabell importeras.

Orsak

Om en tom tabell importeras anger den vanligtvis att data i käll-XML-dokumentet är attributcentrerade. Microsoft Access stöder endast elementcentrerad XML. XML som finns kvar från ADO-postuppsättningar skapas i attributcentrerad XML.

Lösning

I den här artikeln finns information om hur du importerar XML-data som skapas genom att en ADO-postuppsättning bevaras i XML-format. Den transformering som anges i den här artikeln gäller det beständiga formatet ADO XML.

Microsoft tillhandahåller programmeringsexempel enbart i förklarande syfte och gör inga utfästelser, varken uttryckligen eller underförstått. Detta omfattar men begränsas inte till underförstådd garanti för säljbarhet eller lämplighet för ett visst syfte. I denna artikel förutsätts att du känner till det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts supportexperter kan hjälpa till att förklara funktionerna i en viss procedur, men de kommer inte att ändra dessa exempel för att tillhandahålla extra funktioner eller konstruera procedurer för att uppfylla dina specifika behov. För att kunna importera attributcentrerad XML till Access måste du först skapa och använda en XML-transformation (XSLT) på källdokumentet. Den här processen skapar ett nytt XML-dokument som är elementcentrerat och kan importeras till Access.

Skapa ett XML-dokument från ADO

  1. Skapa en ny tom databas och ge den namnet ImportADOXML.mdb.

  2. Klicka på ModulInfoga-menyn.

    Obs! I Access 2007 klickar du på Makro i gruppen Övrigt på fliken Skapa och klickar sedan på Modul.

  3. I Visual Basic, skriver eller klistrar du in följande kod i den nya modulen:

     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. Spara modulen som basCreateADOXML.

  5. I Visual Basic Direktredigeraren klickar du på Direktfönster på menyn Visa för att öppna direktfönstret.

  6. Skriv in följande kod i direktfönstret och tryck sedan på RETUR:

    CreateADOXML
    

Skapa XSL-transformering

Eftersom de namnområden som definieras av ADO inte känns igen av Access definierar följande transformering dessa namnområden, men exkluderar dem från de resulterande utdata.

  1. Starta Anteckningar och skriv sedan följande XSLT-kod:

    <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. Spara dokumentet som ADOXMLToAccess.xsl i samma mapp som du sparar importADOXML.mdb-databasen i.

Använda transformeringen och importen

Om du vill använda XSL-transformeringen måste du använda en XSLT-processor, till exempel Microsoft MSXML3-processor, som installeras med Microsoft Office XP. I följande steg används XML-dokumentobjektmodellen för att tillämpa transformeringen som du skapade tidigare i ett ADO XML-dokument och för att importera den till Access.

Anteckning

I exempelkoden i den här artikeln används XML-dokumentobjektmodellen. För att den här koden ska köras korrekt måste du referera till Microsoft XML 3.0-biblioteket. Det gör du genom att klicka på Referenser på menyn Verktyg i Visual Basic Editor och kontrollera att kryssrutan Microsoft XML, v3.0 är markerad.

  1. Starta Microsoft Access och öppna den ImportADOXML.mdb-databas som du skapade tidigare.

  2. I fönstret Databas klickar du på Moduler under Objekt och sedan på Nytt.

    Obs! I Access 2007 klickar du på Makro i gruppen Övrigt på fliken Skapa och klickar sedan på Modul.

  3. I Visual Basic, skriver eller klistrar du in följande kod i modulen:

    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. I Visual Basic Direktredigeraren klickar du på Direktfönster på menyn Visa för att öppna direktfönstret.

  5. Skriv in följande kod i direktfönstret och tryck sedan på RETUR:

    ImportXMLFromADO
    

    Observera att en tabell som innehåller kunder från Storbritannien med det namn du angett för <TableName> importeras till Access. Du kan också ta bort det elementcentrerade XML-dokument som skapas under transformationen.

Status

Detta är avsiktligt.

Referenser

Mer information om hur du beständiga en ADO-postuppsättning för XML finns i Beständiga poster i XML-format.