【问题标题】:Problem importing multiple XML records to MS Access via VBA通过 VBA 将多个 XML 记录导入 MS Access 时出现问题
【发布时间】:2020-07-13 00:15:11
【问题描述】:

我需要从网站以 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>

这是我认为可行的 Access 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

【问题讨论】:

  • myLineItem(0).Text符号myLineItem(1).Text公司 IDmyLineItem(2).Text公司 ID。你觉得myLineItem(3).Text应该是什么?

标签: xml ms-access vba


【解决方案1】:

由于循环中的这一行,您只打印了第一个 DataRow 的公司名称:

Set myLineItem = xmldoc.selectNodes("//DataRow/DataItem")

它从第一个元素中提取数据,而不管循环中的当前元素是什么。

将循环中的当前代码替换为Debug.print xmlElement.selectSingleNode("DataItem[@name='Company Name']").Text。这将打印当前 DataRow 中 DataItem 的公司名称(又名 xmlElement in loop)

【讨论】:

  • 感谢您的建议。不幸的是,当我进行此更改时,我得到一个运行时错误 91。“对象变量或未设置块变量”。关于可能导致这种情况的任何想法?
  • 查看我的更新,删除selectSingleNode中的前导“/”
  • 是的!杰出的!那成功了。我将更新问题以反映这一点。非常感谢你的帮助!我已经用这个代码做了两个星期了,但没有成功。你解决了我生活中的很多挫折。非常感谢!
  • 我很高兴听到这个消息!
猜你喜欢
  • 2016-01-19
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多