Advertisement
ChrisProsser

VBA Traverse xml

Jul 9th, 2014
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ' Chris Prosser 09/07/2014
  2. ' example use of getElementList (in this case to get all cart elements)
  3.  
  4. Sub getCarts()
  5.     Dim carts As Collection
  6.     Dim i As Integer
  7.    
  8.     Set carts = New Collection
  9.     getElementList "C:\Users\Chris\Dropbox\VBAutomation\AutoImportConfig.xml", "cart", carts
  10.    
  11.     For i = 1 To carts.count
  12.         Debug.Print carts.Item(i)
  13.     Next
  14.  
  15. End Sub
  16.  
  17. ' Chris Prosser 09/07/2014
  18. ' Gets the values of all instances of a specific element from an xml file
  19.  
  20. Public Sub getElementList(xml_file_path As String, _
  21.                           elementName As String, _
  22.                           elementValuesList As Collection)
  23.  
  24.     Dim xmlDoc As MSXML2.DOMDocument
  25.     Dim xmlRoot As MSXML2.IXMLDOMNode
  26.     Dim xmlChildren As MSXML2.IXMLDOMNodeList
  27.     Dim xmlElement As MSXML2.IXMLDOMElement
  28.    
  29.     Set xmlDoc = New MSXML2.DOMDocument
  30.     xmlDoc.async = False
  31.     xmlDoc.validateOnParse = False
  32.     xmlDoc.Load (xml_file_path)
  33.     Set xmlRoot = xmlDoc.documentElement
  34.     Set xmlChildren = xmlRoot.childNodes
  35.    
  36.     iterateOverChildNodes xmlChildren, elementName, elementValuesList
  37.  
  38. End Sub
  39.  
  40. ' Chris Prosser 09/07/2014
  41. ' Call with a list of xmlNodes (can be generated from a file using getElementList)
  42. ' and an element name to search for. The procedure find child nodes and re-runs
  43. ' recursively until all branchs from the list of nodes passed in have been traversed
  44.  
  45. Sub iterateOverChildNodes(xmlChildren As MSXML2.IXMLDOMNodeList, _
  46.                           elementName As String, _
  47.                           elementValuesList As Collection)
  48.  
  49.     Dim xmlElement As MSXML2.IXMLDOMElement
  50.     Dim xmlGrandChildren As MSXML2.IXMLDOMNodeList
  51.    
  52.     For Each xmlElement In xmlChildren
  53.         If xmlElement.nodeName = elementName Then
  54.             'Debug.Print xmlElement.nodeTypedValue
  55.            elementValuesList.Add xmlElement.nodeTypedValue
  56.         Else
  57.             Set xmlGrandChildren = xmlElement.childNodes
  58.             iterateOverChildNodes xmlGrandChildren, elementName, elementValuesList
  59.         End If
  60.     Next xmlElement
  61.  
  62. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement