2016-03-03 9 views
0

У меня есть следующий код в 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 

В настоящее время я цикл через все узлы, а затем в этом случае игнорируя узел называется «поймать», а затем перейдя в следующую итерацию, так как я не требую этого значения узла или узла. Вместо того, чтобы делать это, как бы я изменил свой цикл на тот, где я могу просто перейти непосредственно к узлам, представляющим интерес, и поэтому не нужно пропускать итерации, которые просто кажутся неэффективными?

///// после помощи парфе

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 
+0

http://stackoverflow.com/questions/24188773/xpath-to-select-all-and-exclude-child-and-its-children –

+0

Это может быть немного более эффективным, чтобы сказать это beanChild.nodeName <> «catch» then do stuff – justkrys

ответ

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)]") 
+0

Это выглядит действительно интересно, как бы я изменил набор, если бы у меня был или, например, «catch» или «repive» – Ingram

+1

Просто добавьте условие 'or':' [not (self :: catch или self :: reprive)] ' – Parfait