使用 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的主要内容,如果未能解决你的问题,请参考以下文章