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

Not

Office 365 ProPlus, Microsoft 365 Kurumsal Uygulamaları olarak yeniden adlandırılıyor. Bu değişiklik hakkında daha fazla bilgi için, bu blog yazısını okuyun.

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

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

Belirtiler

Bir XML belgesi ni içe aktardığınızda, en az bir boş tablo alınır veya verilerin tümü alınmaz. XML belgesinin yapısına bağlı olarak, birden fazla tablo gerçekten içe aktarılabilir.

Neden

Boş bir tablo içe 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ı xML öznitelik merkezli XML oluşturulur.

Çözüm

Bu makalede, bir ADO Recordset xml biçiminde kalıcı olarak oluşturulan XML veri almak için nasıl gösterir. 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 aktarabilmek için, öncelikle kaynak belgeye bir XML Dönüşümü (XSLT) oluşturmanız ve uygulamanız gerekir. Bu işlem, öğe merkezli ve Access'e aktarılabilen yeni bir XML belgesi oluşturur.

ADO'dan XML Belgesi Oluşturma

  1. Yeni bir boş veritabanı oluşturun ve importadoxml.mdb adını.

  2. Ekle menüsünde Modül'etıklayın.

    Not Access 2007'de, Oluştur sekmesindeki Diğer grupta Makro'yu tıklatın ve ardından Modül'etıklayın.

  3. Visual Basic Düzenleyicisi'nde, aşağıdaki kodu yeni modüle yazın veya 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

  1. Modülü basCreateADOXML olarak kaydedin.
  2. Visual Basic Düzenleyicisi'nde, Hemen pencereyi açmak için Görünüm menüsündeki Hemen Pencere'yi tıklatın.
  3. Hemen penceresine aşağıdaki kodu yazın ve enter tuşuna basın:
    CreateADOXML
    

XSL Dönüşümü'nu oluşturun

ADO tarafından tanımlanan ad alanları Access tarafından tanınmadığından, aşağıdaki dönüştürme bu ad alanlarını tanımlar, ancak bunları çıkan çıktıdan dışlar.

  1. Not Defteri'ni başlatın ve ardından 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>

  1. Belgeyi ImportADOXML.mdb veritabanını kaydettiğiniz klasöre ADOXMLToAccess.xsl olarak kaydedin.

Dönüştür ve Alma'yı Uygulayın

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

Not

Bu makaledeki örnek kod XML Belge Nesnesi Modelini 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üzenleyicisi'ndeki Araçlar menüsünde Başvurular'ı tıklatın ve Microsoft XML, v3.0 onay kutusunun seçildiğinden emin olun.

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

  2. Veritabanı penceresinde, Nesneleraltındaki Modüller'i tıklatın ve sonra Yeni'yitıklatın.

    Not Access 2007'de, Oluştur sekmesindeki Diğer grupta Makro'yu tıklatın ve ardından Modül'etıklayın.

  3. Visual Basic Editor'da modüle aşağıdaki kodu 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

  1. Visual Basic Düzenleyicisi'nde, Hemen Pencere'yi açmak için Görünüm menüsündeki Hemen Pencere'yi tıklatın.
  2. Hemen Penceresi'ne aşağıdaki kodu yazın ve enter tuşuna basın:
    ImportXMLFromADO
    
    Note İngiltere'den müşterilerin ilerlerak için belirttiğiniz adı içeren bir tablonun Access'e alındığını unutmayın. Dönüştürme sırasında oluşturulan öğe merkezli XML belgesini isteğe bağlı olarak silebilirsiniz.

Durum

Bu davranış tasarımdan kaynaklanır.

Başvuru

Bir ADO Recordset'i XML'de kalıcılık hakkında ek bilgi için Bkz. XML Formatında Kalıcı Kayıtlar.