在处理数据转换任务时,经常会遇到需要将一种格式的数据转换为另一种格式以适应不同的应用程序。本文将介绍如何使用VBScript将XML文件转换为逗号分隔的文本文件,以便能够轻松地导入到MS Access数据库中。
本周,遇到了一个情况,需要允许用户将XML文件导入到MS Access数据库中。首先想到的是使用Excel来完成这项工作,她根据文件创建了一个基于架构的模板。然而,她遇到了一个错误消息,提示文件太大,无法一次性导入到工作表中。虽然有几种方法可以绕过这个限制,但由于目标是将XML导入到MS Access数据库中,将文件转换为更易读的格式成为了下一步。
在这个示例中,使用了来自互联网的XML文件,并从W3schools网站下载了PlantCatalog.xml。同时,使用了Peter Burden编写的样本作为XSL文件的起点。有了这两个文件,只需要编写VBScript来将XML转换为所需的结果文件。
首先,将XML文件保存在C盘上,命名为testme.xml,XSL文件命名为testme.xsl。注意扩展名的区别,这样可以使用相同的文件名来保持简单。结果文件也将保存在C盘上,并命名为testme.txt。
现在,打开记事本并添加以下代码,首先创建所需的变量:
Dim xmlSource
Dim xmlXForm
Dim strErr
Dim strResult
Dim fso, file
Dim strPath
Const ForWriting = 2
Set xmlSource = CreateObject("MSXML.DOMDocument")
Set xmlXForm = CreateObject("MSXML.DOMDocument")
xmlSource.validateOnParse = True
xmlXForm.validateOnParse = True
xmlSource.async = False
xmlXForm.async = False
正如看到的,这只是一些通用的初始化,并创建了加载XML和XSL文件所需的对象,这些文件在下一步中将被使用:
' 这将加载想要转换的文本
xmlSource.Load "c:\testme.xml"
If Err.Number <> 0 Then
strErr = Err.Description & vbCrLf
strErr = strErr & xmlSource.parseError.reason & _
"line: " & _
xmlSource.parseError.Line & _
"col: " & _
xmlSource.parseError.linepos & _
"text: " & xmlSource.parseError.srcText
MsgBox strErr, vbCritical, "Error loading the XML"
End If
' 这将加载XSLT转换
xmlXForm.Load "c:\testme.xsl"
If Err.Number <> 0 Then
strErr = Err.Description & vbCrLf
strErr = strErr & xmlSource.parseError.reason & _
"line: " & _
xmlSource.parseError.Line & _
"col: " & _
xmlSource.parseError.linepos & _
"text: " & xmlSource.parseError.srcText
MsgBox strErr, vbCritical, "Error loading the Transform"
End If
这告诉XML对象将文件加载到内存中进行转换,将在下一步执行:
' 这将转换xmlSource中的数据
strResult = xmlSource.transformNode(xmlXForm)
If Err.Number <> 0 Then
strErr = Err.Description & vbCrLf
strErr = strErr & xmlSource.parseError.reason & _
"line: " & xmlSource.parseError.Line & _
"col: " & xmlSource.parseError.linepos & _
"text: " & xmlSource.parseError.srcText
MsgBox strErr, vbCritical, "Error executing the Transform"
End If
此时,转换后的XML被放入一个名为strResult的字符串变量中,需要将其写入磁盘上的文件:
Set fso = CreateObject("Scripting.FileSystemObject")
strPath = "c:\testme.txt"
' 打开文件
Set file = fso.opentextfile(strPath, ForWriting, True)
' 将信息写入文件
file.write strResult
' 关闭并清理
file.Close
在这一步中,使用了FileSystemObject,它使得在这种情况下写入文件变得非常容易。下载添加了一些对象的清理工作,在这里就不展示了。
这个小项目教会了,当使用广泛可用的工具时,事情可以变得多么容易和方便。对于这个解决方案,使用了MSXML、FSO和记事本,这些通常是Windows平台上任何人都可以使用的工具。这只是简单工具所具有的强大功能的简单示例,对于好的解决方案来说。
映射XML到架构,或者使用通用的导入/导出向导,有时在时间上会更昂贵,这通常是事后才意识到的。这个解决方案花了一个小时来构建和调试,当看到未来项目可能的应用时,这是一个很好的投资。花费的时间是在映射XSL到XML上,认为这也是可以自动化的,但在这方面缺乏一些见解,所以如果认为知道如何在这种解决方案中自动化XML到XSL的映射,请提出建议。或者将在未来的一篇文章中再次自己去做,使用VBScript。
欢迎对本文的任何评论或补充。在这个行业中,可以想到几种不同的方法和工具来解决日常问题,这只是其中之一。