【问题标题】:changing a for each loop into for loop将 for each 循环更改为 for 循环
【发布时间】:2016-03-03 22:47:42
【问题描述】:

我在 VBA 中有以下代码

Dim userBeanList As MSXML2.IXMLDOMNodeList
Dim userbean As MSXML2.IXMLDOMNode
Dim beanChild As MSXML2.IXMLDOMNode

XMLDOC.Load ("https://www.catch.api")

r = 4
Set userBeanList = XMLDOC.SelectNodes("/response/responseBody/responseList/item[recordType='TPI']")
For Each userbean In userBeanList
    For Each beanChild In userbean.ChildNodes
    If beanChild.nodeName = "catch" Then GoTo NextIteration

       Sheets("Sheet2").Cells(r, 1) = beanChild.nodeName
         Sheets("Sheet2").Cells(r, 2) = beanChild.Text

  r = r + 1
NextIteration:
    Next beanChild
Next userbean

目前我正在遍历所有节点,然后在这种情况下忽略名为“catch”的节点,然后进入下一次迭代,因为我不需要该节点或节点值。 而不是这样做,我将如何将我的循环更改为一个我可以直接转到感兴趣的节点的循环,因此不必跳过似乎效率低下的迭代?

/////在冻糕的帮助下

Dim userBeanList As MSXML2.IXMLDOMNodeList
Dim userbean As MSXML2.IXMLDOMNode
Dim beanChild As MSXML2.IXMLDOMNode

XMLDOC.Load ("http://www.catch.api")

r = 4

Set userBeanList = XMLDOC.SelectNodes("/response/responseBody/responseList/item[recordType='TPI']/*[not(local-name)='catch']")
For Each userbean In userBeanList

       Sheets("Sheet2").Cells(r, 1) = userbean.nodeName

         Sheets("Sheet2").Cells(r, 2) = userbean.Text

         r = r + 1

Next userbean

【问题讨论】:

标签: vba loops for-loop


【解决方案1】:

考虑将其从 xpath 表达式中排除。下面指定name()local-name() 不等于'catch' 的任何子级。这甚至可以避免子节点上的内部 For Each 循环。

Set userBeanList = XMLDOC.SelectNodes("/response/responseBody/responseList" _
                                     & "/item[recordType='TPI']/*[not(local-name)='catch']")

或者,self

Set userBeanList = XMLDOC.SelectNodes("/response/responseBody/responseList" _
                                     & "/item[recordType='TPI']/*[not(self::catch)]")

【讨论】:

  • 这看起来很有趣,如果我有一个 or ,我将如何更改设置,例如 'catch' 或 'reprive'
  • 只需添加or条件:[not(self::catch or self::reprive)]
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多