【问题标题】:Exporting Access Table into XML using VBA使用 VBA 将访问表导出为 XML
【发布时间】: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

【问题讨论】:

    标签: xml vba ms-access


    【解决方案1】:

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

    您可以使用Application.TransformXMLMSXML 库运行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,我只是想尽可能多地教育自己。非常感谢您的帮助。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2013-05-07
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多