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
Skapa en ny tom databas och ge den namnet ImportADOXML.mdb.
Klicka på Modul på Infoga-menyn.
Obs! I Access 2007 klickar du på Makro i gruppen Övrigt på fliken Skapa och klickar sedan på Modul.
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 SubSpara modulen som basCreateADOXML.
I Visual Basic Direktredigeraren klickar du på Direktfönster på menyn Visa för att öppna direktfönstret.
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.
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>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.
Starta Microsoft Access och öppna den ImportADOXML.mdb-databas som du skapade tidigare.
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.
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 SubI Visual Basic Direktredigeraren klickar du på Direktfönster på menyn Visa för att öppna direktfönstret.
Skriv in följande kod i direktfönstret och tryck sedan på RETUR:
ImportXMLFromADOObservera 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.