Share via


Essential Handler Methods

 

Although the Simple API for XML (SAX) can catch many events as it parses through a document, this application focuses on the most frequently used methods. In this example, the ContentHandlerImpl class implements all methods for IVBSAXContentHandler and IVBSAXErrorHandler interfaces, but code is added only to those methods that you want the application to be aware of, including documentLocator, startElement, endElement, characters, and endDocument for the ContentHandler, and fatalError for the ErrorHandler. As the reader passes through the document, it reports events in document order: documentLocator, followed by startDocument, startElement, characters, endElement, and endDocument.

set IVBSAXContentHandler_documentLocator method

The set IVBSAXContentHandler_documentLocator method is the first event thrown by the SAX reader when is passes through a document. This method receives a pointer to the IVBSAXLocator interface, which provides methods for returning the column number, line number, public ID, or system ID for a current document. Because this is the first method thrown, it is a good place to put initialization code.

In the following snippet, the Initialize procedure sets the TitleTrue flag, the flag that indicates if the element is within scope, to False. This procedure also sets the errorHappen flag to False. This flag is used to indicate that a fatal error has been thrown by the ErrorHandler and prevents the HandleError procedure in the form from overwriting the error message thrown by the ErrorHandler.

Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS As _
                                                    MSXML2.IVBSAXLocator)
    Initialize
End Property

Private Sub Initialize()
    errorHappen = False
    TitleTrue = False
End Sub

startElement Method

The startElement event is thrown by the reader each time it encounters the "<" character of a new element. The startElement method receives the namespace URI for the element, the local name, and the qualified name of the element. Attributes for the element are sent as a separate object containing the type, URI, local name, and value of each attribute. These values can be accessed from the attributes object within the startElement method.

In this method, the first if clause sets the FilterTrue flag if the element name passed by the startElement event matches the element name specified as the filter criteria. When FilterTrue is True, the second if clause invokes the startElement method from the oContentHandler object, which holds a reference pointing to oWriter, the MXXMLWriter object created in the form. This pushes the data passed by the startElement method to the oWriter object.

Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, _
                                              strLocalName As String, _
                                              strQName As String, _
                                              ByVal oAttributes As _
                                              MSXML2.IVBSAXAttributes)
    If strLocalName = FilterCriteria Then
        FilterTrue = True
    End If
    If FilterTrue Then
        oContentHandler.startElement strNamespaceURI, strLocalName, _
                                     strQName, oAttributes
    End If
End Sub

characters Method

The characters method receives the character content between the opening and closing tags of an element. For this example, the characters method contains code that pushes character data to the writer only when the FilterTrue flag is set to True.

Private Sub IVBSAXContentHandler_characters(strChars As String)
    If FilterTrue Then
           oContentHandler.characters strChars
    End If
End Sub

endElement Method

SAX often throws events in pairs, modeling the structure of the XML document. For example, a startDocument event has a corresponding endDocument event and a startElement event has a corresponding endElement event. For the endElement method, the first if clause pushes the content received by the endElement method to the writer when the FilterTrue flag is True. The second if clause sets the FilterCriteria flag to False when the value passed by the endElement method matches the filter criteria. This indicates that the element is no longer in scope.

Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, _
                                             strLocalName As String, _
                                             strQName As String)
    If FilterTrue Then
         oContentHandler.endElement strNamespaceURI, strLocalName, _
                                    strQName
    End If
    If strLocalName = FilterCriteria Then
        FilterTrue = False
    End If
End Sub

fatalError Method

Finally, code is added to the fatalError method to capture any errors thrown by the reader during parsing. If a fatal error is received, the error message is displayed in the Text1 box. The errorHappen flag is set to True, preventing the HandlerError routine in the form from overwriting the fatalError error message.

Private Sub IVBSAXErrorHandler_fatalError(ByVal oLocator As _
                                          MSXML2.IVBSAXLocator, _
                                          strErrorMessage As String,_ 
                                          ByVal nErrorCode As Long)
    Form1.Text1.Text = strErrorMessage & nErrorCode
    errorHappen = True
End Sub

See Also

Run the Application (Simple Filter)
IMXWriter Interface
MXXMLWriter CoClass
ISAXContentHandler Interface
ISAXErrorHandler Interface