Access'te öznitelik merkezli XML'i içeri aktaramazsınız

Gelişmiş: Uzman kodlama, birlikte çalışabilirlik ve çok kullanıcılı beceriler gerektirir.

Bu makale, Microsoft Access veritabanı (.mdb) dosyası veya Microsoft Access veritabanı (.accdb) dosyası için geçerlidir.

Belirtiler

XML belgesini içeri aktardığınızda, en az bir boş tablo içeri aktarılır veya verilerin tümü içeri aktarılmaz. XML belgesinin yapısına bağlı olarak, aslında birden fazla tablo içeri aktarılabilir.

Neden

Boş bir tablo içeri aktarılırsa, genellikle kaynak XML belgesinin verilerinin öznitelik merkezli olduğunu gösterir. Microsoft Access yalnızca öğe merkezli XML'i destekler. ADO kayıt kümelerinden kalıcı olan XML, öznitelik merkezli XML'de oluşturulur.

Çözüm

Bu makalede, bir ADO Kayıt Kümesini XML biçiminde kalıcı hale getirmekle oluşturulan XML verilerini içeri aktarma işlemi gösterilmektedir. Bu makalede sağlanan dönüştürme, ADO XML kalıcı biçimi için geçerlidir.

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar; örtülü veya açık garanti vermez. Buna zımni garantiler, satılabilirlik veya belirli bir amaca uygunluk da dahildir, ancak bunlarla sınırlı değildir. Bu makale, gösterilen programlama dilini ve yordamları oluşturmak ve hata ayıklamak amacıyla kullanılan araçları kullanmayı bildiğinizi varsayar. Microsoft destek mühendisleri, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir, ancak gereksinimlerinizi karşılamaya yönelik olarak ek işlevsellik sağlamak veya yordamlar geliştirmek amacıyla bu örnekleri değiştirmezler. Öznitelik merkezli XML'yi Access'e aktarmak için önce kaynak belgeye xml dönüşümü (XSLT) oluşturup uygulamanız gerekir. Bu işlem, öğe merkezli ve Access'e aktarılabilir yeni bir XML belgesi oluşturur.

ADO'dan XML Belgesi Oluşturma

  1. Yeni bir boş veritabanı oluşturun ve ImportADOXML.mdb olarak adlandırlayın.

  2. Ekle menüsünden Modül'e tıklayın.

    Not Access 2007'de, Oluştur sekmesinin Diğer grubunda Makro'ya ve ardından Modül'e tıklayın.

  3. Visual Basic Düzenleyici aşağıdaki kodu yazın veya yeni modüle yapıştırın:

     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. Modülü basCreateADOXML olarak kaydedin.

  5. Visual Basic Düzenleyici, Görünüm menüsünde Hemen Pencere'ye tıklayarak Anında penceresini açın.

  6. Hemen penceresine aşağıdaki kodu yazın ve ENTER tuşuna basın:

    CreateADOXML
    

XSL Dönüşümü Oluşturma

ADO tarafından tanımlanan ad alanları Access tarafından tanınmadığından, aşağıdaki dönüşüm bu ad alanlarını tanımlar, ancak sonuçta elde edilen çıktının dışında tutar.

  1. Not Defteri'ni başlatın ve aşağıdaki XSLT kodunu yazın:

    <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. Belgeyi ADOXMLToAccess.xsl olarak ImportADOXML.mdb veritabanını kaydettiğiniz klasöre kaydedin.

Dönüştürme ve İçeri Aktarmayı Uygulama

XSL dönüşümünü uygulamak için, Microsoft Office XP ile yüklenen Microsoft MSXML3 işlemcisi gibi bir XSLT işlemci kullanmanız gerekir. Aşağıdaki adımlarda, daha önce oluşturduğunuz dönüşümü bir ADO XML belgesine uygulamak ve Access'e aktarmak için XML Belge Nesne Modeli kullanılır.

Not

Bu makaledeki örnek kod XML Belgesi Nesne Modeli'ni kullanır. Bu kodun düzgün çalışması için Microsoft XML 3.0 kitaplığına başvurmanız gerekir. Bunu yapmak için Visual Basic Düzenleyici Araçlar menüsünde Başvurular'a tıklayın ve Microsoft XML, v3.0 onay kutusunun seçili olduğundan emin olun.

  1. Microsoft Access'i başlatın ve daha önce oluşturduğunuz ImportADOXML.mdb veritabanını açın.

  2. Veritabanı penceresinde, Nesneler'in altında Modüller'e ve ardından Yeni'ye tıklayın.

    Not Access 2007'de, Oluştur sekmesinin Diğer grubunda Makro'ya ve ardından Modül'e tıklayın.

  3. Visual Basic Düzenleyici aşağıdaki kodu modüle yazın veya yapıştırın:

    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 Düzenleyici, Görünüm menüsünde Hemen Pencere'ye tıklayarak Anında Pencere'yi açın.

  5. Anlık Pencere'ye aşağıdaki kodu yazın ve ENTER tuşuna basın:

    ImportXMLFromADO
    

    TableName> için <belirttiğiniz ada sahip Birleşik Krallık müşterilerini içeren bir tablonun Access'e aktarıldığını unutmayın. İsteğe bağlı olarak, dönüştürme sırasında oluşturulan öğe merkezli XML belgesini silebilirsiniz.

Durum

Bu davranış tasarımdan kaynaklanır.

Başvurular

ADO Kayıt Kümesini XML'de kalıcı hale getirmek hakkında ek bilgi için bkz . Kayıtları XML biçiminde kalıcı hale getirmek.