You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:VBScript实现XLS转DAT及XML解析(带命令行参数)

解决VBScript解析XML获取Length节点并存入字典的问题

我来帮你搞定这个XML解析的问题!你遇到的核心问题是标准MSXML DOM的节点索引是从0开始的,而QTP的XMLUtil是从1开始计数的,这和你之前的QTP代码习惯不一样,再加上一些语法细节错误,导致代码失效。

先看你提供的XML示例:

<RECORD> 
  <CD> 
    <Name>HEAD</Name> 
    <Length>4</Length> 
  </CD> 
  <CD> 
    <Name>ORGCODE</Name> 
    <Length>5</Length> 
  </CD> 
  <CD> 
    <Name>ORGNAME</Name> 
    <Length>30</Length> 
  </CD>
  <CD> 
    <Name>SCNAME</Name> 
    <Length>30</Length> 
  </CD> 
  <CD> 
    <Name>FILLER</Name> 
    <Length>290</Length> 
  </CD> 
</RECORD>

修正后的代码方案1:使用getElementsByTagName

' 1. 创建字典对象
Set objDict = CreateObject("Scripting.Dictionary")
' 2. 创建XML DOM对象
Set objXML = CreateObject("Microsoft.XMLDOM")
objXML.async = False ' 关闭异步加载,确保加载完成再处理
objXML.validateOnParse = True ' 可选:开启验证,方便排查XML格式问题
' 3. 加载XML文件(注意Load方法不需要括号)
If Not objXML.Load(fileloc) Then
    MsgBox "XML加载错误:" & objXML.parseError.reason
    WScript.Quit
End If
' 4. 获取所有Length节点
Set lengthNodes = objXML.getElementsByTagName("Length")
' 5. 遍历节点(索引从0开始,到length-1结束)
For i = 0 To lengthNodes.length - 1
    ' 用节点的text属性获取文本内容,字典的key可以用i+1对应你习惯的1开始编号
    objDict.Add i + 1, lengthNodes.Item(i).text
Next

' 测试输出:遍历字典验证结果
For Each key In objDict.Keys
    MsgBox "Key: " & key & ", Length值: " & objDict(key)
Next

修正后的代码方案2:使用XPath selectNodes

Set objDict = CreateObject("Scripting.Dictionary")
Set objXML = CreateObject("Msxml2.DOMDocument.6.0") ' 建议指定版本,避免兼容性问题
objXML.setProperty "SelectionLanguage", "XPath"
objXML.async = False
objXML.validateOnParse = True

If Not objXML.Load(fileloc) Then
    MsgBox "XML加载错误:" & objXML.parseError.reason
    WScript.Quit
End If

' 使用XPath定位所有Length节点
Set lengthNodes = objXML.selectNodes("/RECORD/CD/Length")
' 同样从0开始遍历
For i = 0 To lengthNodes.length - 1
    objDict.Add i + 1, lengthNodes(i).text ' Item(i)可以简化为lengthNodes(i)
Next

' 验证输出
For Each key In objDict.Keys
    WScript.Echo "Key: " & key & ", Length值: " & objDict(key)
Next

关键修正点说明

  • 索引起始值:标准MSXML DOM的节点集合索引是从0开始的,所以循环要从0到节点集合.length - 1,而不是从1开始,否则会漏掉第一个节点,还会导致越界错误。
  • 节点文本获取:XML节点的文本内容要使用.text属性,而不是.Value()方法(QTP的XMLUtil可能用Value,但标准DOM用text)。
  • Load方法语法:objXML.Load是方法,不需要加括号(如果加括号的话,在VBScript里会被当成表达式,需要用Call objXML.Load(fileloc))。
  • 错误处理:添加XML加载的错误判断,方便排查XML文件本身的格式问题。
  • 指定DOM版本:建议使用Msxml2.DOMDocument.6.0,这是较新的版本,兼容性和稳定性更好。

这样修改后,你就能成功获取所有Length节点的文本值,并按1开始的编号存入字典,后续就可以用字典里的长度值来处理DAT文件的空格填充了。

内容的提问来源于stack exchange,提问作者EvereBuddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:48:38