我需要从网站检索XML格式的数据并将其保存在Access数据库中。虽然我能够成功提取数据,但我在解析数据时遇到了问题。具体来说,我似乎只能读取返回的第一条记录,而不知道如何循环浏览剩余的记录。
下面是源 XML 的外观示例。这是特定个人的工作经历,因此姓名、头衔和日期字段将随每条记录而变化。在此示例中,此人有 7 个可用的就业记录,每个记录在不同的公司。
<DataRow>
<DataItem name="Symbol">00123S-E</DataItem>
<DataItem name="Company ID">061ABC-E</DataItem>
<DataItem name="Company Ticker">@NA</DataItem>
<DataItem name="Company Name">L.L. Bean, Inc.</DataItem>
<DataItem name="Title">Independent Director</DataItem>
<DataItem name="Function Code">IND</DataItem>
<DataItem name="Function Description">Independent Dir/Board Member</DataItem>
<DataItem name="Start Date">20140508</DataItem>
<DataItem name="End Date">@NA</DataItem>
</DataRow>
这是我认为可以工作的访问VBA代码:
Private Sub bNewFetch_Click()
Dim xmldoc As MSXML2.DOMDocument
Dim xmlElement As MSXML2.IXMLDOMElement
Dim xmlSelection As MSXML2.IXMLDOMSelection
Dim myLineItem As Object
Set xmldoc = New MSXML2.DOMDocument
xmldoc.async = False
xmldoc.Load [Here's where the URL goes]
Set xmlSelection = xmldoc.selectNodes("//DataRow")
For Each xmlElement In xmlSelection
Set myLineItem = xmldoc.selectNodes("//DataRow/DataItem")
Debug.Print myLineItem(3).Text
Next xmlElement
End Sub
不幸的是,代码没有返回此人工作的 7 家不同公司的名称,而是简单地返回"L.L. Bean, Inc."。7倍。它似乎知道有 7 条记录,但它不是逐步浏览这些记录并返回每条记录的相关公司名称,而是重复第一条记录中的公司名称。
任何人都可以建议我需要做什么才能从每个返回的记录中检索所有数据,而不仅仅是第一个?
提前感谢您的任何建议。
溶液:
感谢BankBuilder指出我的检索循环的问题。解决方案是将最后一个 For/Next 语句替换为:
For Each xmlElement In xmlSelection
Debug.print xmlElement.selectSingleNode("DataItem[@name='Company Name']").Text
Next xmlElement
由于循环中的以下行,您只打印了第一个 DataRow 的公司名称:
Set myLineItem = xmldoc.selectNodes("//DataRow/DataItem")
它从第一个元素中提取数据,而不考虑循环中的当前元素。
将循环中的当前代码替换为Debug.print xmlElement.selectSingleNode("DataItem[@name='Company Name']").Text
。这将在当前数据行(又名循环中的 xmlElement)中打印数据项的公司名称