Gustav Brock
Gustav at cactus.dk
Fri Apr 20 07:05:35 CDT 2007
Hi Marty
Thanks! Great example.
Seems to work fine even with XML 3.0.
/gustav
>>> martyconnelly at shaw.ca 20-04-2007 03:02 >>>
Option Compare Database
Option Explicit
Dim mcolRate As Collection
Sub testxml()
Set mcolRate = New Collection
'find daily US dollar fixed rate vs Euro from Euro Central Bank
' via XPath
GrabXMLFile ("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml")
Debug.Print mcolRate("USD")
MsgBox "US Euro Rate ECB " & mcolRate("USD")
End Sub
Public Function GrabXMLFile(ByRef AdviserXML As String)
'http://www.ecb.int/stats/exchange/eurofxref/html/index.en.html
'Base currency is Euro so will have to do a conversion for USD
'Note the link for other pages with sources for XML etc.
'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml
'On Error GoTo ErrorHandler
'needs reference set to XML 4.0 and maybe ADO 2.8
Dim oDOMDocument As MSXML2.DOMDocument40
Dim oNodeList As IXMLDOMNodeList
Dim oAdviserDetailsNode As IXMLDOMNode
Dim oLowestLevelNode As IXMLDOMElement
Dim oNode As IXMLDOMNode
Dim objXMLDOMNamedNodeMap As IXMLDOMNamedNodeMap
Dim xPError As IXMLDOMParseError
Dim Mydb As Database
Dim myrs As ADODB.Recordset
Dim sTempValue As String
Set oDOMDocument = New MSXML2.DOMDocument40
oDOMDocument.async = False
oDOMDocument.validateOnParse = True 'you may want to parse for errors
oDOMDocument.resolveExternals = False
oDOMDocument.preserveWhiteSpace = True
'use if xml disk file
If Not oDOMDocument.Load(AdviserXML) Then
MsgBox ("XML File error")
Set xPError = oDOMDocument.parseError
DOMParseError xPError
End If
Set oAdviserDetailsNode = oDOMDocument.documentElement
Debug.Print oDOMDocument.xml
'use appropriate XPath expression to select nodes
' Set oNodeList = oAdviserDetailsNode.selectNodes("Envelope/Cube/Cube/@*")
Set oNodeList = oAdviserDetailsNode.selectNodes("//@*")
Debug.Print oNodeList.length
For Each oNode In oNodeList
' Debug.Print "*" & oNode.Text; oNode.nodeName & "*"
Select Case oNode.nodeName
Case "currency"
sTempValue = oNode.Text
Case "rate"
'This path is used to store a variable on the collection
On Error Resume Next
mcolRate.Remove sTempValue
mcolRate.Add oNode.Text, sTempValue
Debug.Print sTempValue & " rate " & oNode.Text
On Error GoTo ErrorHandler
End Select
Next
Set oNodeList = Nothing
Set oDOMDocument = Nothing
Set oAdviserDetailsNode = Nothing
Set objXMLDOMNamedNodeMap = Nothing
Exit Function
ErrorHandler:
' Call NewError.Raise(Err.Number, Err.Source, Err.Description)
End Function
Sub DOMParseError(xPE As IXMLDOMParseError)
' The document failed to load.
Dim strErrText As String
' Obtain the ParseError object
With xPE
strErrText = "Your XML Document failed to load" & _
"due the following error." & vbCrLf & _
"Error #: " & .errorCode & ": " & xPE.reason & _
"Line #: " & .Line & vbCrLf & _
"Line Position: " & .linepos & vbCrLf & _
"Position In File: " & .filepos & vbCrLf & _
"Source Text: " & .srcText & vbCrLf & _
"Document URL: " & .url
End With
Debug.Print strErrText
Dim s As String
Dim r As String
Dim i As Long
s = ""
For i = 1 To xPE.linepos - 1
s = s & " "
Next
r = "XML Error loading " & xPE.url & " * " & xPE.reason
Debug.Print r
'show character postion of error; tired of counting chars in xml file
If (xPE.Line > 0) Then
r = "at line " & xPE.Line & ", character " & xPE.linepos & vbCrLf & _
xPE.srcText & vbCrLf & s & "^"
End If
Debug.Print r
MsgBox strErrText, vbExclamation
End Sub