LOCAL oReader AS MSXML2.SAXXMLReader oReader = CREATEOBJECT("MSXML2.SAXXMLReader") oHandler = CREATEOBJECT("VFPSaxHandler") oReader.contentHandler = oHandler oReader.ErrorHandler = oHandler oreader.DTDHandler = oHandler oReader.Parse([<?xml version="1.0"?><root name="someroot"><child1></child1><child2>/<child2></root>]) ?oReader.nAttributes DEFINE CLASS VFPSAXHandler AS Session OLEPUBLIC IMPLEMENTS IVBSAXContentHandler IN "msxml3.dll" IMPLEMENTS IVBSAXDTDHandler IN "msxml3.dll" IMPLEMENTS IVBSAXErrorHandler IN "msxml3.dll" nAttributes = 0 * IVBSAXContentHandler__put_documentLocator = .NULL. PROCEDURE IVBSAXContentHandler_put_documentLocator(oLocator AS Object) AS VARIANT ENDPROC PROCEDURE IVBSAXContentHandler_startDocument() AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_endDocument() AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_startPrefixMapping(strPrefix AS STRING, strURI AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_endPrefixMapping(strPrefix AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_startElement(strNamespaceURI AS STRING, strLocalName AS STRING, strQName AS STRING, oAttributes AS VARIANT) AS VOID THIS.nAttributes = THIS.nAttributes + oAttributes.Length ENDPROC PROCEDURE IVBSAXContentHandler_endElement(strNamespaceURI AS STRING, strLocalName AS STRING, strQName AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_characters(strChars AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_ignorableWhitespace(strChars AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_processingInstruction(strTarget AS STRING, strData AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXContentHandler_skippedEntity(strName AS STRING) AS VOID ENDPROC PROCEDURE IVBSAXDTDHandler_notationDecl(strName AS STRING @, strPublicId AS STRING @, strSystemId AS STRING @) AS VOID ENDPROC PROCEDURE IVBSAXDTDHandler_unparsedEntityDecl(strName AS STRING @, strPublicId AS STRING @, strSystemId AS STRING @, strNotationName AS STRING @) AS VOID ENDPROC PROCEDURE IVBSAXErrorHandler_error(oLocator AS VARIANT, strError AS STRING @, nErrorCode AS Number) AS VOID ENDPROC PROCEDURE IVBSAXErrorHandler_fatalError(oLocator AS VARIANT, strError AS STRING @, nErrorCode AS Number) AS VOID MESSAGEBOX("Error: " + strError) ENDPROC PROCEDURE IVBSAXErrorHandler_warning(oLocator AS VARIANT, strError AS STRING @, nErrorCode AS Number) AS VOID MESSAGEBOX("Warning: " + strError) ENDPROC PROCEDURE IVBSAXErrorHandler_IgnorableWarning(oLocator AS VARIANT, strError AS STRING @, nErrorCode AS Number) AS VOID MESSAGEBOX("Ignorable Warning: " + strError) ENDPROC ENDDEFINE