Access で属性中心の XML をインポートすることはできません
高度な機能: 高度なコーディング、相互運用性、マルチユーザー スキルが必要です。
この記事は、Microsoft Access データベース (.mdb) ファイルまたは Microsoft Access データベース (.accdb) ファイルに適用されます。
現象
XML ドキュメントをインポートすると、少なくとも 1 つの空白のテーブルがインポートされるか、すべてのデータがインポートされるわけではありません。 XML ドキュメントの構造によっては、複数のテーブルが実際にインポートされる場合があります。
原因
空白のテーブルがインポートされる場合、通常はソース XML ドキュメントのデータが属性中心であることを示します。 Microsoft Access では、要素中心の XML のみがサポートされます。 ADO レコードセットから永続化される XML は、属性中心の XML で作成されます。
解決方法
この記事では、ADO Recordset を XML 形式に永続化することによって作成された XML データをインポートする方法について説明します。 この記事で提供される変換は、ADO XML 永続化形式に適用されます。
Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。 属性中心の XML を Access にインポートするには、まず XML 変換 (XSLT) を作成してソース ドキュメントに適用する必要があります。 このプロセスにより、要素中心の新しい XML ドキュメントが作成され、Access にインポートできます。
ADO から XML ドキュメントを作成する
新しい空のデータベースを作成し、ImportADOXML.mdbという名前を付けます。
[挿入] メニューの [モジュール] をクリックします。
メモAccess 2007 で、[作成] タブの [その他] グループで [マクロ] をクリックし、[モジュール] をクリックします。
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
モジュールを basCreateADOXML として保存します。
Visual Basic エディターで、[表示] メニューの [イミディエイト ウィンドウ] をクリックして、[イミディエイト] ウィンドウを開きます。
[イミディエイト] ウィンドウに次のコードを入力し、Enter キーを押します。
CreateADOXML
XSL 変換を作成する
ADO によって定義された名前空間は Access によって認識されないため、次の変換によってこれらの名前空間が定義されますが、結果の出力から除外されます。
メモ帳を起動し、次の 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>
ドキュメントを ADOXMLToAccess.xsl として、ImportADOXML.mdb データベースの保存先と同じフォルダーに保存します。
変換とインポートを適用する
XSL 変換を適用するには、Microsoft Office XP にインストールされている Microsoft MSXML3 プロセッサなどの XSLT プロセッサを使用する必要があります。 次の手順では、XML ドキュメント オブジェクト モデルを使用して、前に作成した変換を ADO XML ドキュメントに適用し、それを Access にインポートします。
注:
この記事のサンプル コードでは、XML ドキュメント オブジェクト モデルを使用します。 このコードを正しく実行するには、Microsoft XML 3.0 ライブラリを参照する必要があります。 これを行うには、Visual Basic エディターの [ツール] メニューの [参照] をクリックし、[Microsoft XML,v3.0 チェック] ボックスが選択されていることを確認します。
Microsoft Access を起動し、前に作成したImportADOXML.mdb データベースを開きます。
[データベース] ウィンドウで、[オブジェクト] の [モジュール] をクリックし、[新規] をクリックします。
メモAccess 2007 で、[作成] タブの [その他] グループで [マクロ] をクリックし、[モジュール] をクリックします。
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
Visual Basic エディターで、[表示] メニューの [イミディエイト ウィンドウ] をクリックしてイミディエイト ウィンドウを開きます。
イミディエイト ウィンドウに次のコードを入力し、Enter キーを押します。
ImportXMLFromADO
TableName に指定した<名前の英国の顧客を含むテーブルが Access にインポートされることに注意してください。> 必要に応じて、変換中に作成された要素中心の XML ドキュメントを削除できます。
状態
この動作は仕様です。
関連情報
ADO Recordset を XML に永続化する方法の詳細については、「XML 形式でのレコードの永続化」を参照してください。