65.9K
CodeProject 正在变化。 阅读更多。
Home

使用XSL将XML转换为CSV

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.15/5 (17投票s)

2006 年 5 月 1 日

3分钟阅读

viewsIcon

277396

downloadIcon

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。
© . All rights reserved.