![]() |
MobileVB XML Parse Class - FAQ | |
| Links MobileVB XML Contact Us Downloads |
Q: On PocketPC, setting XmlElement to nothing crashes the program A: To keep the program from crashing, do the following for each of the XmlElement objects you create and then the XMLEngine boject: oRoot.Clear Set oRoot = Nothing oXMLEngine.UpdateXmlEvent Nothing oXMLEngine.InitializeBeforeParsing Set oXMLEngine = Nothing Q: How do I start Parsing using the InetHTTP Ingot: A: Create a form with a Timer and InetHttp Ingot. Name the Timer: tmrProcess and the InetHTTP: InetOffice, then cut and paste this code into the form. Option Explicit
Private oXMLEngine As New XmlEngine
Private iCancelTimeout As Integer
Private dCancel As Date
Private iStatus As eRemoteStatus
Private Enum eRemoteStatus
rsUnknown = 0
rsConnecting = 1
rsConnected = 2
rsWaitingForResponse = 3
rsReceivingData = 4
rsDataRecieved = 5
rsError = 6
rsDone = 7
rsProcessing = 8
End Enum
Private Sub Connect()
' Prepare the XMLEngine for Parsing the incoming data
oXMLEngine.BuildTreeDuringParse = True
oXMLEngine.InitializeBeforeParsing
' Sends the information
iStatus = rsConnecting
dCancel = DateAdd("s", iCancelTimeout, Now)
InetOffice.URL = sURL
InetOffice.Document = sPost
InetOffice.Execute
DoEvents
' Starts the Timer to check to see if the information has been complete processed
tmrProcess.Enabled = True
End Sub
Private Sub InetOffice_Error()
' Error
On Error Resume Next
Select Case InetOffice.SystemError
Case 1: UpdateStatus "Error: Too Many Clients"
Case 2: UpdateStatus "Error: Handle Invalid"
Case 3: UpdateStatus "Error: Param Invalid"
Case 4: UpdateStatus "Error: Version Invalid"
Case 5: UpdateStatus "Error: URL Buffer Too Small"
Case 6: UpdateStatus "Error: URL Invalid"
Case 7: UpdateStatus "Error: Too Many Sockets"
Case 8: UpdateStatus "Error: No Request Created"
Case 9: UpdateStatus "Error: No Connected"
Case 10: UpdateStatus "Error: Invalid Request"
Case 11: UpdateStatus "Error: Need Time"
Case 12: UpdateStatus "Error: Host Name Invalid"
Case 13: UpdateStatus "Error: Invalid Port"
Case 14: UpdateStatus "Error: Invalid Host Address"
Case 15: UpdateStatus "Error: Nil Buffer"
Case 16: UpdateStatus "Error: Connection Timeout"
Case 17: UpdateStatus "Error: Reslove Timeout"
Case 18: UpdateStatus "Error: Send Request Timeout"
Case 19: UpdateStatus "Error: Read Timeout"
Case 20: UpdateStatus "Error: Buffer Too Small"
Case 21: UpdateStatus "Error: Scheme Not Supported"
Case 22: UpdateStatus "Error: Invalid Resposne"
Case 25: UpdateStatus "Error: Setting Too Large"
Case 26: UpdateStatus "Error: Setting Size Invalid"
Case 27: UpdateStatus "Error: Request Too Long"
Case 28: UpdateStatus "Error: Setting Not Implemented"
Case 29: UpdateStatus "Error: Config Not Found"
Case 30: UpdateStatus "Error: Config Can't Delete"
Case 31: UpdateStatus "Error: Config Too Many"
Case 32: UpdateStatus "Error: Config Bad Name"
Case 33: UpdateStatus "Error: Config not Alias"
Case 34: UpdateStatus "Error: Config Can't Point to Alias"
Case 35: UpdateStatus "Error: Config Empty"
Case 37: UpdateStatus "Error: Config Alias Error"
Case 38: UpdateStatus "Error: No Wireless Interface"
Case 39: UpdateStatus "Error: Encryption not avialable"
Case 40: UpdateStatus "Error: Need to Retry Encryption Sequence Number"
Case 41: UpdateStatus "Error: Need to Retry Encryption Public Key"
Case 42: UpdateStatus "Error: Response Too Short"
Case 43: UpdateStatus "Error: Mobitex Illegal OK Host"
Case 44: UpdateStatus "Error: Mobitex Illegal Bad Host"
Case 45: UpdateStatus "Error: HTTP Bad Request"
Case 46: UpdateStatus "Error: HTTP Unauthorized"
Case 47: UpdateStatus "Error: HTTP Forbidden"
Case 48: UpdateStatus "Error: HTTP Not Found"
Case 49: UpdateStatus "Error: HTTP Method not allowed"
Case 50: UpdateStatus "Error: HTTP Not Acceptable"
Case 51: UpdateStatus "Error: HTTP Proxy Authorization Required"
Case 52: UpdateStatus "Error: HTTP Request Timeout"
Case 53: UpdateStatus "Error: HTTP Conflict"
Case 54: UpdateStatus "Error: HTTP Gone"
Case 55: UpdateStatus "Error: HTTP Length required"
Case 56: UpdateStatus "Error: HTTP Precondition Failed"
Case 57: UpdateStatus "Error: HTTP Request Too Large"
Case 58: UpdateStatus "Error: HTTP Request URI Too Long"
Case 59: UpdateStatus "Error: HTTP Unsupported Type - " & InetOffice.ContentType
Case 60: UpdateStatus "Error: HTTP Server Error"
Case 61: UpdateStatus "Error: CTP Server Error"
Case 62: UpdateStatus "Error: Type Not cached"
Case 63: UpdateStatus "Error: Cache Invalid"
Case 64: UpdateStatus "Error: URL Dispatched"
Case 65: UpdateStatus "Error: Database Not Found"
Case 66: UpdateStatus "Error: CTP Malformed Request"
Case 67: UpdateStatus "Error: CTP Unknown Command"
Case 68: UpdateStatus "Error: CTP Truncated"
Case 69: UpdateStatus "Error: CTP Unknown Error"
Case 70: UpdateStatus "Error: CTP Proxy Error"
Case 71: UpdateStatus "Error: CTP Socket Error"
Case 72: UpdateStatus "Error: CTP Invalid URL"
Case 73: UpdateStatus "Error: CTP Referring Page Out of Date"
Case 74: UpdateStatus "Error: CTP Bad Request"
Case 76: UpdateStatus "Error: CTP Mail Server Down"
Case 77: UpdateStatus "Error: CTP Host not found"
Case 78: UpdateStatus "Error: CTP Content - Invalid Tag"
Case 79: UpdateStatus "Error: CTP Content - Internal"
Case 80: UpdateStatus "Error: CTP Content- Data End"
Case 81: UpdateStatus "Error: CTP Content - Resource Too Big"
Case 82: UpdateStatus "Error: CTP Content - No No Frames"
Case 83: UpdateStatus "Error: CTP Content - Unsupported Content"
Case 84: UpdateStatus "Error: CTP Content - Unsupported Encoding"
Case 85: UpdateStatus "Error: CTP Content - Bad Form"
Case 86: UpdateStatus "Error: CTP Content - Bad Form Missing Action"
Case 87: UpdateStatus "Error: CTP Content - Bad Form Missing Method"
Case 88: UpdateStatus "Error: CTP Content - No source data"
Case 89: UpdateStatus "Error: CTP Content - Bad Image"
Case 90: UpdateStatus "Error: CTP Content - Image Too Large"
Case 91: UpdateStatus "Error: Mobitex Error Handled"
Case 92: UpdateStatus "Error: Proxy Down - Bad Host"
Case 93: UpdateStatus "Error: Host Connection Lost"
Case 94: UpdateStatus "Error: Link Not Found"
Case Else: UpdateStatus "Error: " & InetOffice.ResponseInfo & " (" & InetOffice.ResponseCode & ")"
End Select
iStatus = rsError
End Sub
Private Sub InetOffice_ReceivedData(ByVal totalSize As Long)
' Received information
On Error Resume Next
' Update the timeout value
dCancel = DateAdd("s", iCancelTimeout, Now)
' Update the status
UpdateStatus totalSize & " Bytes Received"
End Sub
Private Sub InetOffice_StateChanged(ByVal newState As Long)
Dim sTemp As String
' State Changed
On Error Resume Next
' Update the timeout
dCancel = DateAdd("s", iCancelTimeout, Now)
' Process the status
Select Case newState
Case afINetHTTPStatusAcquiringNetwork
' Looking for network
UpdateStatus "Acquiring Network"
Case afINetHTTPStatusClosed
' Connection has closed
UpdateStatus "Closed"
iStatus = rsError
Case afINetHTTPStatusClosingConnection
' Closing the connection
UpdateStatus "ClosingConnection"
Case afINetHTTPStatusConnected
' Connected
UpdateStatus "Connected"
iStatus = rsConnected
Case afINetHTTPStatusConnecting
' Currently connection
UpdateStatus "Connecting"
iStatus = rsConnecting
Case afINetHTTPStatusNameResolved
' Name was resolved
UpdateStatus "Name Resolved"
Case afINetHTTPStatusNew
' Connection just openned
Case afINetHTTPStatusReceivingResponse
' Receiving information
UpdateStatus "Receiving Response"
iStatus = rsReceivingData
Case afINetHTTPStatusResolvingName
' Resolving the host name
UpdateStatus "Resolving Name"
Case afINetHTTPStatusResponseReceived
'We received a valid response so lets get the data
UpdateStatus "Parsing Data..."
iStatus = rsReceivingData
' Verify the data is valid
If InetOffice.ResponseCode = 404 Then
' Unable to find document
UpdateStatus InetOffice.ResponseInfo
iStatus = rsError
ElseIf InetOffice.ResponseCode = 403 Then
' Unable to access document
UpdateStatus InetOffice.ResponseInfo
iStatus = rsError
Else
' Setup the XML Engine
' Start gathering the information from the web site
sTemp = InetOffice.GetChunk(100)
While Len(sTemp) > 0
' loop until there is not mroe data to aquire
oXMLEngine.AppendAndParse sTemp
sTemp = InetOffice.GetChunk(100)
DoEvents
Wend
' Mark as received
UpdateStatus "Received Data"
iStatus = rsDataRecieved
End If
Case afINetHTTPStatusSendingRequest
' Send request
UpdateStatus "Sending Request"
Case afINetHTTPStatusUnsupported
' Unsupported status
UpdateStatus "Unsupported"
Case afINetHTTPStatusWaitingForResponse
' Waiting for response from server
UpdateStatus "Waiting for Response"
iStatus = rsWaitingForResponse
Case Else
UpdateStatus "State Changed: " & newState
End Select
End Sub
Private Sub UpdateStatus(ByVal Value As String)
' Display the status change
End Sub
Private Sub tmrProcess_Timer()
' Decide if we need to enble the close butt
Dim dNow As Date
Dim iNowTime As Long
Dim iCancelTime As Long
On Error Resume Next
If iStatus = rsError Or iStatus = rsUnknown Then
' Error when connectin. Enable the close button
lblTimeout.Caption = ""
dCancel = NullDate
cmdClose.Visible = True
ElseIf iStatus = rsDataRecieved Then
' We have received all the data, now let's update the class information
lblTimeout.Caption = ""
dCancel = NullDate
iStatus = rsProcessing
ProcessXML
ElseIf iStatus = rsDone Then
' the data has been received.
lblTimeout.Caption = ""
dCancel = NullDate
cmdClose.Visible = True
ElseIf Now > dCancel And Not dCancel = NullDate Then
' We have reached a timeout. Return an error
lblTimeout.Caption = ""
dCancel = NullDate
InetOffice.Cancel
iStatus = rsError
UpdateStatus "Timeout: We have been waiting for too long to recieve information from the office. Either you connect is no longer active, or you have a bad connect"
cmdClose.Visible = True
ElseIf Not dCancel = NullDate Then
' Update the timeout status
iNowTime = (Hour(Now) * 3600) + (Minute(Now) * 60) + Second(Now)
iCancelTime = (Hour(dCancel) * 3600) + (Minute(dCancel) * 60) + Second(dCancel)
lblTimeout.Caption = "Timeout In: " & iCancelTime - iNowTime
End If
End Sub
Private Sub ProcessXML()
' Process the informatoin received
End Sub
Q: How do I use the IXmlEvent Class A: The IXmlClass was added to help speed up processing of large XMLDocuments. It will allows you process your XML Elements as they are being decoded. Option Explicit
' Xml Parsing information
Implements IXmlEvent
' -----------------------------------------------------------------------------------
' Xml Events
' -----------------------------------------------------------------------------------
Private Sub IXmlEvent_ProcessXML(ByVal ElementName As String, oXmlElement As XmlElement)
' Process the XML Element
Select Case ElementName
Case "Fastrax.PartList.Part"
' Process this Parts element. This element will be found more than once
' during the decoding process
Case "Fastrax.TaskBook.Task"
' Process this Task element. This element will be found more than once
' during the decoding process
Case "Fastrax.Company"
' Process the Company element
End Select
End Sub
Private Sub ProcesXMLFile()
Dim sFileName As String
Dim oCSVFile As CFileTextReadable
Dim sLine As String
Dim oFileMgr As New CFileManager
Dim oXMLEngine As New XmlEngine
Dim iOffset As Long
Dim iNumBytes As Long
Dim iFileSize As Long
Dim oXmlEvent As IXmlEvent
' Reads an Exml File
On Error Resume Next
sFileName = "Fastrax.xml"
' Gets the Text File
Set oCSVFile = oFileMgr.OpenReadOnlyAsText(sFileName)
If Err.Number = 0 Then Exit Sub
' Creates the XMLEvent Boject
Set oXmlEvent = Me
' Start processing the task information
oXMLEngine.EventElementClear
oXMLEngine.AddEventElement "Fastrax.PartList.Part"
oXMLEngine.AddEventElement "Fastrax.TaskBook.Task"
oXMLEngine.AddEventElement "Fastrax.Company"
oXMLEngine.UpdateXmlEvent oXmlEvent
oXMLEngine.InitializeBeforeParsing
' Start processing the information from the CSV
iOffset = 0
iFileSize = oCSVFile.Size
Do
' Reads the next line
If (iFileSize - iOffset) < 1000 Then
iNumBytes = (iFileSize - iOffset)
Else
iNumBytes = 1000
End If
sLine = oCSVFile.Read(iNumBytes)
' Update status
iOffset = iOffset + Len(sLine)
' Process the information
oXMLEngine.AppendAndParse sLine
Loop Until oCSVFile.Peek = -1
Set oCSVFile = Nothing
' Clean up
oXMLEngine.CleanupAfterParsing
Set oXMLEngine = Nothing
End Sub
|
|