使用XSL将XML转换为CSV






3.15/5 (17投票s)
2006 年 5 月 1 日
3分钟阅读

277396

3406
一篇关于使用 XSL 将 XML 转换为 CSV 的文章
引言
这个VBScript将使用来自Microsoft的MSXML DLL,使用XSL转换XML文件为用分号分隔的文件,该文件可以轻松导入到许多其他尚未完全了解XML的应用程序中。
背景
这周,我面临一个情况,用户需要被允许将XML文件导入到MS Access数据库中。我最初的想法是使用Excel来实现这个目的,并且她根据文件创建了一个模式。然后她遇到了一个消息,说文件太大,无法一次导入到工作表中。有几种方法可以解决此限制,但由于目标是将XML导入到MS Access数据库中,因此将文件转换为更易读的格式是我们下一步的目标。
Using the Code
对于此示例,我使用了来自互联网的XML文件,并从 W3schools 网站下载了PlantCatolog.xml 文件。 并且作为XSL文件的起点,我使用了 Peter Burden 编写的示例。 有了这两个文件,我们只需要编写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文件所需的对象
' This loads the text that I want to transform
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
' This loads the XSLT transform
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对象将文件加载到内存中,以便进行我们下一步执行的转换
' This transforms the data in 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"
' open the file
Set file = fso.opentextfile(strPath, ForWriting, True)
' write the info to the file
file.write strResult
' close and clean up
file.Close
对于最后一步,我们使用了 FileSystemObject
,这使得像这样的情况下的文件写入非常容易。 下载内容为对象添加了一些清理操作,我将在此处省略。
关注点
这个小项目教会了我,当您使用广泛可用的工具时,事情可以变得多么容易和方便。 对于此解决方案,我使用了 MSXML、FSO 和记事本,这些都是 Windows 平台上任何人都通用的工具。 这只是一个简单的例子,说明了简单工具为良好解决方案带来的强大力量。
将XML映射到模式,或者使用通用的导入/导出向导,有时在时间方面要昂贵得多,这通常是在事后才意识到的。 这个解决方案花了我一个小时的时间来构建和调试,这是一个很好的投资,当您看到未来项目的可能应用时。 花费的时间在于将XSL映射到XML,我认为这也可以自动化,但我在这一点上缺乏一些见解,所以如果您知道一种自动化此解决方案中 XML 到 XSL 映射的方法,欢迎提出任何建议。 或者我将在未来的文章中再次亲自完成,使用 VBScript。
欢迎对本文提出任何评论或补充。 在这个行业中,我们可以想到几种不同的方法和工具来解决日常问题,这只是其中之一。
编程愉快!
历史
- 2006.04.29 - 版本 0.1。