使用 VBA 将访问表导出为 XML

Posted

技术标签:

【中文标题】使用 VBA 将访问表导出为 XML【英文标题】:Exporting Access Table into XML using VBA 【发布时间】:2016-06-28 01:50:39 【问题描述】:

我有一个最初从 XML 导入的访问表。当我导出它时,我没有与原始 XML 表相同的 XML 结构。

原来导入的表格如下:

<?xml version="1.0" standalone="true"?>
<profiling>
  <program>
    <name>118CDSpro</name>
    <p1on>1</p1on>
    <p1tool>36</p1tool>
    <p2on>OFF</p2on>
    <cut>OFF</cut>
    <rule>OFF</rule>
    <desc>118 Clad DirectSet Profile</desc>
    <pic>akv.bmp</pic>
    <ten>dilec_F</ten>
  </program>
<profiling/>

这是我在导出中得到的:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot generated="2016-06-27T12:16:29" xmlns:od="urn:schemas microsoft-com:officedata">
  <Profiling>
     <name>Din_C92S_pro2</name>
     <p1on>1</p1on>
     <p1tool>40</p1tool>
     <p2on>OFF</p2on>
     <cut>OFF</cut>
     <rule>OFF</rule>
     <desc>Inswing Door Sash Profile 2 (Storm)</desc>
     <ten>dilec_F</ten>
  </Profiling>
</dataroot>

我认为问题出在 .xsl 文件中,但我是 VBA 新手,不确定如何使用它。

此代码必须非常具体地针对原始格式。

任何建议将不胜感激。

选项 2 代码:

Sub ProfileXML2()

    ' RAW XML EXPORT
    Application.ExportXML acExportTable, "Profiling", "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfileExport.xml"


    ' TRANSFORM RAW XML (OPTION 2 - full XSLT processor)
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object

    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xslDoc = CreateObject("MSXML2.DOMDocument")
    Set newDoc = CreateObject("MSXML2.DOMDocument")

    ' LOAD XML AND XSL FILES
    xmlDoc.Load "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfileExport.xml"
    xmlDoc.async = False

    xslDoc.Load "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfilingSchema.xsl"
    xslDoc.async = False

    ' TRANSFORM SOURCE TO FINAL
    xmlDoc.transformNodeToObject xslDoc, newDoc
    newDoc.Save "C:\MyData\Crafter 0610\Crafter\DATA\ProfilingTest.xml"

    Set newDoc = Nothing
    Set xslDoc = Nothing
    Set xmlDoc = Nothing

End Sub

【问题讨论】:

【参考方案1】:

目前没有问题。 MS Access 不保留导入的 XML 文件结构。您收到的输出是 XML 格式的表格或查询输出的标准模板。但是由于您的最终使用需求无法适应这种原始输出,请考虑使用XSLT,这是一种专门用于转换 XML 文档的语言。

您可以使用Application.TransformXML 或MSXML 库运行XSLT。下面的 VBA 代码显示了这两个选项。此 XSLT 是一个特殊脚本,因为前两个模板匹配从返回本地元素名称的输出中删除命名空间 urn:schemas microsoft-com:officedata

XSLT 脚本(另存为 .xsl 以在 VBA 中加载)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">    
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:element name="local-name()">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:copy/>
  </xsl:template>

  <xsl:template match="dataroot">    
    <xsl:apply-templates select="Profiling"/>    
  </xsl:template>

  <xsl:template match="Profiling">
    <profiling>
      <program>
        <xsl:apply-templates select="*"/>
      </program>
    </profiling>
  </xsl:template>

</xsl:stylesheet>

VBA脚本

Public Sub XMLHandle()

    ' RAW XML EXPORT
    Application.ExportXML acExportTable, "TableName", "C:\Path\To\Raw\Output.xml"

    ' TRANSFORM RAW XML (OPTION 1 - limited XSLT method)    
    Application.TransformXML "C:\Path\To\Raw\Output.xml", _
                             "C:\Path\To\XSLT\Transform.xsl", _
                             "C:\Path\To\Final\Output.xml"

    ' TRANSFORM RAW XML (OPTION 2 - full XSLT processor)
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object

    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xslDoc = CreateObject("MSXML2.DOMDocument")
    Set newDoc = CreateObject("MSXML2.DOMDocument")

    ' LOAD XML AND XSL FILES
    xmlDoc.Load "C:\Path\To\Raw\Output.xml"
    xmlDoc.async = False

    xslDoc.Load "C:\Path\To\XSLT\Transform.xsl"
    xslDoc.async = False

    ' TRANSFORM SOURCE TO FINAL
    xmlDoc.transformNodeToObject xslDoc, newDoc
    newDoc.Save "C:\Path\To\Final\Output.xml"

    Set newDoc = Nothing
    Set xslDoc = Nothing
    Set xmlDoc = Nothing

End Sub

输出

<?xml version="1.0" encoding="UTF-8"?>
<profiling>
    <program>
        <name>Din_C92S_pro2</name>
        <p1on>1</p1on>
        <p1tool>40</p1tool>
        <p2on>OFF</p2on>
        <cut>OFF</cut>
        <rule>OFF</rule>
        <desc>Inswing Door Sash Profile 2 (Storm)</desc>
        <ten>dilec_F</ten>
    </program>
</profiling>

【讨论】:

我对两者都进行了测试,除了没有缩进这一事实之外,第一个选项效果很好,我相信这不会真正影响 XML 数据表。第二个选项给了我一个错误,说“XML 文档中只允许一个***元素”。除了我自己的知识之外,这并不重要,因为第一个选项效果很好。 太棒了!如果回答有帮助,请接受。第二个选项将正确缩进。我无法重新创建该错误。确保路径指向正确的文件。 我仍在尝试区分答案和 cmets。我确实在关于选项 2 的原始问题中添加了一些内容,即存在未正确编码的内容。 您仍然收到错误消息吗?您的 xml 是否与您发布的 sn-p 一样完全?发布第一个元素。您是否正确复制了 .xsl 脚本?需要明确的是,XSL 一个 XML 文件,并遵循与打开/结束标记相同的规则。最后,您运行的是哪个版本的 MS Access?什么 Windows 版本? 我从您的示例中剪切并粘贴,据我所知,它们看起来是相同的。选项 1 工作正常,选项 2 返回运行时错误,显示“XML 文档中只允许一个***元素”。我正在使用 Windows 10 运行 Access 2013。我并不担心,因为我有你的解决方案。关于选项 2,我只是想尽可能多地教育自己。非常感谢您的帮助。

以上是关于使用 VBA 将访问表导出为 XML的主要内容,如果未能解决你的问题,请参考以下文章

错误 3011 VBA 在访问中将所有表导出到 txt

VBA 将 Excel 范围导出到特定目录和文件名

通过 VBA 代码将多张工作表导出为 .pdf

访问 VBA 将 CSV 文件导出为 UTF-8

将工作表导出为 CSV 会覆盖原始文件名 VBA

如何用VBA将excel表导出成文本类型的文件?