' ' Add a parameter to an element ' Function addChild(oEl, sName, vItem) Dim bRet : bRet = False Dim oTemp : Set oTemp = oDOM.createElement(sName) Select Case TypeName(vItem) Case "Empty" setTypedData oTemp, "string", "" Case "Null" oTemp.setAttribute "href", "#SOAPNULL" bRet = True Case "Boolean" setTypedData oTemp, "boolean", vItem Case "Byte" setTypedData oTemp, "ui1", CInt(vItem) Case "Integer" setTypedData oTemp, "int", vItem Case "Long" setTypedData oTemp, "int", vItem Case "Single" setTypedData oTemp, "float", vItem Case "Double" setTypedData oTemp, "float", vItem Case "Currency" setTypedData oTemp, "fixed.14.4", vItem Case "Date" setTypedData oTemp, "dateTime", vItem Case "String" vItem = Replace(vItem, "&", "&", 1, -1, 1) vItem = Replace(vItem, "<", "<", 1, -1, 1) setTypedData oTemp, "string", vItem Case "Error" setTypedData oTemp, "string", "Got an error" 'Dim oErr : Set oErr = oDOM.createElement("Error") 'addChild oErr, "errorcode", CInt(Err.number) 'addChild oErr, "message", Err.description Case "Connection" setTypedData oTemp, "string", vItem.Provider Case "Recordset" Dim oRS : Set oRS = oDOM.createElement("Recordset") Do While Not vItem.EOF Dim oRec : Set oRec = oDOM.createElement("Record") Dim oField, oNodeField for each oField in vItem.fields Set oNodeField = oDOM.createElement(oField.name) If addChild(oRec, oField.name, oField.value) Then bRet = True End If Next oRS.appendChild(oRec) vItem.MoveNext Loop oTemp.appendChild(oRS) Case "IXMLDOMNode" oTemp.appendChild(vItem) Case "IXMLDOMParseError" Dim oPE : Set oPE = oDOM.createElement("ParseError") addChild oPE, "url", vItem.url addChild oPE, "line", vItem.line addChild oPE, "srcText", vItem.srcText addChild oPE, "reason", vItem.reason oTemp.appendChild(oPE) Case "Array" Dim oAr : Set oAr = oDOM.createElement("Array") for i = 0 to UBound(vItem) - 1 If addChild(oAr, "Item", vItem(i)) Then bRet = True End If next oTemp.appendChild(oAr) Case Else If VarType(vItem) > vbArray Then Set oAr = oDOM.createElement("Array") for i = 0 to UBound(vItem) - 1 If addChild(oAr, "Item", vItem(i)) Then bRet = True End If next oTemp.appendChild(oAr) Else setTypedData oTemp, "string", "Unrecognised: " & TypeName(vItem) & " [" & VarType(vItem) & "]" End If End Select oEl.appendChild(oTemp) addChild = bRet end function function setTypedData(ByRef oNode, sType, vData) on error resume next oNode.setAttribute "type", sType oNode.dataType = sType oNode.nodeTypedValue = vData If Err Then oNode.setAttribute "type", "string" oNode.dataType = "string" 'vData = "err" oNode.nodeTypedValue = _ "Error setting '" & oNode.nodeName & "' " _ & "(type " & sType & ") to " _ & "'" & vData & "' " _ & "(type " & VarTypeText(vData) & "). " _ & "[" & err.number & "-" & err.description& "-" & err.source & "]" Err.Clear End If on error goto 0 end function ' ' Just discovered that VB has a function that does this! ' Function VarTypeText(v) Select Case VarType(v) Case vbEmpty sRet = "Empty" Case vbNull sRet = "Null" Case vbBoolean sRet = "Boolean" Case vbByte sRet = "Byte" Case vbInteger sRet = "Integer" Case vbLong sRet = "Long" Case vbSingle sRet = "Single" Case vbDouble sRet = "Double" Case vbCurrency sRet = "Currency" Case vbDate sRet = "Date" Case vbString sRet = "String" Case vbError sRet = "Error" Case vbObject sRet = "Object of type " & TypeName(v) Case vbArray sRet = "Array" Case vbVariant sRet = "Variant" Case Else sRet = "undefined" End Select VarTypeText = sRet End Function