第一次在这里发布海报,对 VBscript 有点陌生。我真的可以从你们知道这一点的人那里得到一些帮助,就像第二天性一样。我试图包含一些相关信息,希望不要太多。
我一直在努力让它发挥作用,经过几天的尝试和十几次代码迭代,我终于伸出了手。我还没有找到从 XML 文档中的多个级别(noes 和 chidlren)提取数据的示例。
我的任务是使用 VBScript 从 XML 文件中提取数据。具体项目是:年份、帐号、当前应付金额、是否拖欠?(真/假)和格式化的认股权证编号。
XML 文件的格式如下,有 1,000 到 10,000 多个节点填充此数据,其中还有大量“杂项”节点。
<BillData>
<BillHeader>
<Year>2010</Year>
<misc></misc>
<misc2></misc2>
<misc3></misc3>
<AcctNumber>0002566129</AcctNumber>
<misc4></misc4>
<PayAmounts>
<CurrentAmountDue>133.06</CurrentAmountDue>
<misc5></misc5>
</PayAmounts>
<misc6></misc6>
<HasDelinquents>true</HasDelinquents>
<WarrantInfo>
<FormattedWarrantNumber>201115447</FormattedWarrantNumber>
</WarrantInfo>
</BillHeader>
</BillData>
CurrentAmountDue 和 FormattedWarrantNumber 可能并不总是存在。我并不是说它们是空白的,而是 CurrentAmountDue 的整个条目可能会丢失,如下所示。
<PayAmounts>
<misc5></misc5>
</PayAmounts>
我需要将此数据提取到逗号分隔的文本文件中。如果数据不存在,那么我只需要插入命令,所以当输出最终导入 Excel 时,可以注意到它是空白的。
我面临的挑战是进入不同的子节点并正确提取数据。我似乎无法正确选择不同的节点。
这些是我用作参考的一些链接,但似乎无法使其正常工作。
http://technet.microsoft.com/en-us/magazine/2007.02.heyscriptingguy.aspx 这似乎是前进的方向,但我收到错误“此处应进行节点测试”:
Set colNodes=xmlDoc.SelectNodes("/BillData/BillHeader/*" (Year | Account | CurrentAmountDue)")
我在 Stack 上发现了一篇帖子,它建议在下面使用这种技术,但是一旦我超过了两个值,它就对我不起作用,而我有更多。我猜这是因为 CurrentAmountDue 和 FormattedWarrantNumber 可以说是 XML 的更深层次。
strQuery = "/BillData/BillHeader/ " & _
"[name()='Year' or name()='AccountNumber' or name()='HasDelinquents' or name()='CurrentAmountDue' or name()='FormattedWarrantNumber']"
令我惊讶的是,我能够让它返回一些值,但不是全部在同一个循环中,所以我的输出是关闭的(第一行将只显示年份,最后一行丢失)并且只是一个逗号。
strQuery = "/BillData/BillHeader/*"
Set colNodes=xmlDoc.selectNodes(strQuery)
For Each objNode in colNodes
' some lame if then statements that get the values, but this can't be the correct approach!
' these three items (Year, Account and HasDelinquents are under each BillHeader as far as I can tell, but this doesn't seem to be the most effective method.
if objNode.nodeName = "Year" then strYear = objNode.text
if objNode.nodeName = "Account" then strAccount = objNode.text
if objNode.nodeName = "HasDelinquents" then strHasDelq = objNode.text
for each CurrentAmt in objNode.SelectNodes("./CurrentAmountDue")
strCurrAmt = CurrentAmt.text
' i finally got a value here when I use msgbox to view it.'
next
for each WarrantNum in objNode.SelectNodes("./FormattedWarrantNumber")
strWarNum = WarrantNum.text
' getting this value also when I use msgbox to view it.
next
next
所以你可以看到我的尝试是徒劳的。
我也尝试在下面插入这一行。我把它放在最后一个 NEXT 之前,但它没有按预期工作。我还尝试在写入文件之前插入一些 IF-Then 语句来检查 Year 和 Account 中的值,然后在写入文件后清除这些值。这几乎奏效了,但我的第一行和最后一行没有产生正确的数据。
objFileToWrite.WriteLine(strYear & "," & strAccount & "," & strCurrAmt & "," & strHasDelq & "," & strWarNum)
好的,既然您已经对我史前编写此代码的尝试感到傻笑,您能帮帮我吗?:) 让我知道是否需要其他任何东西。感谢您投入的任何时间。我知道你们中的一些人可能会轻松地解决这个问题。