VB 6 and SAX (reading an XML file being used by the DOM)

Posted on 2004-07-30
Last Modified: 2008-01-09
I would like to create a systray application which will show the current status of an application.  The idea is that I will determine the status of a batch process by reading its corresponding XML log file.  The log file looks like this:
      <RunGroup logDate="2004/07/30 12:13:43 PM">
            <TaskGroup logDate="2004/07/30 12:13:43 PM" name="Backup XPS Directory">
                  <method logDate="2004/07/30 12:13:43 PM" name="zip" status="success">
                  <method logDate="2004/07/30 12:13:44 PM" name="copy" status="success">
      <RunGroup logDate="2004/07/30 12:13:53 PM">
            <TaskGroup logDate="2004/07/30 12:13:53 PM" name="Backup XPS Directory">
                  <method logDate="2004/07/30 12:13:53 PM" name="zip" status="success">
                  <method logDate="2004/07/30 12:13:54 PM" name="copy" status="failed">
The application creating this log file is doing so via the MSXML DOM (version 4).

When I attempt to access the file also using the DOM while the other process is writing to it I get an error stating that I cannot access it since another process is using it.
I am assuming that this is because the DOM can be used to write to the file as well.  However, in my case I only want to read from the file.
So, I am assuming that I have to use SAX to do this, but just can't get a grasp on how to do this.  I have read numerous Microsoft articles but still am not sure.

So, can anyone provide code to extract from the above the last status?  From the above it would be "failed".  Also, am I correct in saying that SAX will be able to access the file while the DOM still has a hold of it?  If this is incorrect, is there a way to actually do this?
Question by:dtomyn
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
LVL 75

Expert Comment

by:Anthony Perkins
ID: 11681088
It would be no different with SAX.  You are going to have to retry until it has quit writing the Xml document.

Author Comment

ID: 11681179
Is SAX not like a read only recorset though?  Can you think of any other alternative (than to keep retrying)?   Hmmm... I suppose if the file is locked I can assume that the other process is working though... I was hoping to be able to display the method though in the tooltip.
LVL 75

Expert Comment

by:Anthony Perkins
ID: 11681488
>>Is SAX not like a read only recorset though? <<
In a sense, yes.  Although strictly speaking it is more like a firehose (forward-only, read-only) resultset.  But to continue your analogy, you cannot open (not even) a read-only recordset if the database is opened exclusively.  I suspect what is happening is that while it is writing the file is locked.  However, this has to be only very briefly, so a retry after one second should suffice.
PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now


Author Comment

ID: 11681573
Would you be able to post some code to read the last status attribute given the XML above (using SAX... my current method is using the DOM)?  Just for completeness I would like to try this.
LVL 75

Expert Comment

by:Anthony Perkins
ID: 11681822
Sorry cannot help you there, I have never used it.  Hopefully someone else can step up to the plate.

Accepted Solution

aParser earned 250 total points
ID: 11992949
Based in part on


Implements MSXML2.IVBSAXContentHandler
Implements MSXML2.IVBSAXErrorHandler
Private moSaxReader As MSXML2.SAXXMLReader 'SAX reader
Public logDate As Date

Private Sub Class_Initialize()
    'set up the SAX reader
    Set moSaxReader = New MSXML2.SAXXMLReader
    'pass a reference to this object to use as the content handler...
    Set moSaxReader.contentHandler = Me
    'and error handler objects
    Set moSaxReader.errorHandler = Me
End Sub
Private Sub Class_Terminate()
    Set moSaxReader = Nothing
End Sub

Public Sub LoadLog(strFile As String)
    moSaxReader.parseURL strFile
End Sub
Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes)
    ' add whatever conditions necessary here; "method" is only for illustration here
    If strLocalName = "method" Then
        logDate = CDate(oAttributes.getValueFromName("", "logDate"))
    End If
End Sub

[whatever routine you like]
    Dim o As CSAXLog
    Set o = New CSAXLog
    o.LoadLog strFilePath ' strFilePath is the full path to your log file
    Debug.Print "Last log date: " & o.logDate
    Set o = Nothing

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…

689 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question