VBScript使用loadXML解析XML文件未返回预期结果求助
VBScript使用loadXML解析XML文件未返回预期结果求助
看起来你在写VBScript解析汇率XML文件的时候遇到瓶颈了,我来帮你梳理下问题所在,再给你调整后的代码方案~
首先看你的代码,核心问题出在XPath的使用逻辑上:
- 你通过
getElementsByTagName("tecaj")拿到了所有<tecaj>节点,然后在循环里用绝对路径//tecajnica[@datum]去查找,这会从XML根节点重新开始搜索,而不是从当前<tecaj>节点的上下文找父节点,这肯定拿不到你想要的对应关系 - 另外,汇率日期
datum是在<tecajnica>节点上的,这个节点是所有<tecaj>的父节点,其实不需要每次循环都重新获取,一次性拿到就好
先假设你的XML结构大概是这样的(根据你的代码推断):
<tecajnica datum="2024-05-20"> <tecaj oznaka="EUR">7.532</tecaj> <tecaj oznaka="USD">7.015</tecaj> ... </tecajnica>
那调整后的代码应该是这样的:
Dim oXml, b, tecajnicaNode, tecajNodes, i, ExDate, ExCurrency, ExRate Set oXml = CreateObject("MSXML2.DOMDocument") oXml.async = false oXml.validateOnParse = false ' 如果XML没有DTD可以关掉验证,加快加载 b = oXml.load("C:\Tecajnica\dtecbs.xml") If Not b Then WScript.Echo "加载XML失败:" & oXml.parseError.reason WScript.Quit End If ' 先拿到根节点tecajnica,一次性获取日期 Set tecajnicaNode = oXml.selectSingleNode("//tecajnica") If Not tecajnicaNode Is Nothing Then ExDate = tecajnicaNode.getAttribute("datum") WScript.Echo "汇率日期:" & ExDate Else WScript.Echo "未找到tecajnica节点" WScript.Quit End If ' 获取所有tecaj节点 Set tecajNodes = oXml.getElementsByTagName("tecaj") For i = 0 To tecajNodes.length - 1 Set currentTecaj = tecajNodes.item(i) ' 直接从当前tecaj节点获取货币代码 ExCurrency = currentTecaj.getAttribute("oznaka") ' 这里假设汇率值是tecaj节点的文本内容,根据你的XML结构调整 ExRate = currentTecaj.text ' 这里可以加代码把ExDate、ExCurrency、ExRate写入数据库 WScript.Echo "货币:" & ExCurrency & ",汇率:" & ExRate & ",日期:" & ExDate Next
给你解释下关键的修改点:
- 先一次性获取
<tecajnica>节点,拿到全局的汇率日期,不用在循环里重复查找,效率更高 - 遍历
<tecaj>节点时,直接从当前节点获取属性和内容,不用绕弯路用绝对XPath,避免上下文错误 - 增加了XML加载失败的错误提示,方便你排查文件路径、XML格式错误
- 去掉了冗余的XPath绝对路径调用,改用更直接的节点属性访问
另外你需要确认你的XML结构是否和我假设的一致,如果<tecaj>节点的汇率值不是文本内容,而是存放在子节点里,那你再调整对应的节点获取逻辑就行。
备注:内容来源于stack exchange,提问作者Mila Kotnik
相关产品推荐
相关产品推荐

